【问题标题】:Difference between Calling Static function from Object and Class itself从对象和类本身调用静态函数的区别
【发布时间】:2016-08-13 11:06:31
【问题描述】:

我正在学习单例设计模式,我确实理解了这个概念。但是,我对以下代码有疑问:-

class Token
{
    private static int i = 5;
    private static Token obj = new Token();

//Private Constructor
    private Token()
    {
    }

//Returning the singleton object
    public static Token getObject()
    {
        return obj;
    }

    public static int getValue()
    {
        return i;
    }
}

public class TestMain
{
    public static void main(String args[])
    {
        Token obj = Token.getObject();

        System.out.println("Without object " + Token.getValue());
        System.out.println("With object " + obj.getValue());
    }
}

在这两种情况下都会打印实例变量 i -

Without object 5
With object 5

两种获取实例变量的方式有什么区别,推荐哪一种?

【问题讨论】:

  • 您的代码中没有“实例变量i”。当字段是静态时,它不是实例变量。

标签: java oop design-patterns static singleton


【解决方案1】:

i 是一个静态变量,属于 Token 类,因此对于 Token 类型的所有对象,它将具有相同的值。

出于所有实际目的,obj.getValue()Token.getValue() 相同,您可以使用其中任何一个,但为了更好的可读性,请使用 Token.getValue(),因为它强化了静态变量 i 和静态方法 @987654328 的想法@ 属于整个类,而不属于该类的某些对象。

【讨论】:

  • 好吧,我明白了。如果有一个非静态私有变量“val”,那么要访问它,我们就需要对象 - obj。否则,对于所有静态变量,这两种方法实际上是相同的。对吗?
【解决方案2】:

事实上,在obj 中,你引用了你的单例。所以调用Token.getValue() 引用与obj.getValue() 相同的obj

【讨论】:

    【解决方案3】:

    几乎没有区别,例如您需要实际实例的访问权限,而您并不总是拥有。

    至于偏好,这取决于你问谁。对我来说,静态字段和方法应该使用类而不是实例来访问——这清楚地表明它是静态的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 2011-07-12
      • 2018-02-06
      • 2014-09-29
      • 2011-01-24
      • 1970-01-01
      • 2010-10-28
      相关资源
      最近更新 更多