2017-08-10 11 views
0

我试图在这里练习Singleton类。singleton类中的成员变量的单一副本

public class StaticClass { 

    public static StaticClass staticObject = new StaticClass(); 

    private int counter; 

    private StaticClass() { 

    } 

    public static StaticClass getMyObject() { 
     return staticObject; 
    } 

    public Integer showCounter() { 
     return ++counter; 
    } 
} 

public class TestSingleton { 

    public static void main(String[] args) { 

     new TestSingleton().testImplementation(); 
    } 

    public void testImplementation() { 
     StaticClass obj1 = StaticClass.getMyObject(); 

     Integer obj1Int = obj1.showCounter(); 

     StaticClass obj2 = StaticClass.getMyObject(); 

     Integer obj2Int = obj2.showCounter(); 

     StaticClass obj3 = StaticClass.getMyObject(); 

     Integer obj3Int = obj3.showCounter(); 

     System.out.println(obj1Int+","+obj2Int+","+obj3Int); 
    } 
} 

但我有点困惑,在这里保持计数器变量的单一副本。

运行程序后,我得到不同的计数器值为1,2,3

作为为什么有多个值的任何建议?

+0

showCounter()在返回值之前通过递增计数器来更改计数器的值。所以你看到的输出是预期的。 – jhauris

回答

2

您每次拨打电话时都会得到不同的号码,因为showCounter()方法在您拨打电话时会增加计数器的副作用。

public Integer showCounter() { 
    return ++counter; 
      ^^----------- This adds 1 to the counter. 
} 

它比一个有点混乱,有一种叫做show方法的副作用那样多。我将它分解为两种方法:

public int getCounter() { 
    return counter; 
} 

public int incrementCounter() { 
    return ++counter; 
} 

另外,请在JDK中查看AtomicInteger。如果你所需要的只是一个线程安全和原子的计数器,它可以为你做到这一切。

+0

谢谢@Todd,(只是为了cur媚)是否可以在增加计数器之后保持计数器的单个副本,因为我们有单个副本的类? – Ankit

+0

是的,只有一个计数器副本。它是静态的,所以这意味着只有其中一个不管你创建的类有多少个实例。 – Todd

+0

是否可以输出为'3,3,3'? – Ankit

1

这就是单身人士的工作原理。

如果您比较obj1 == obj2,您会看到它返回true。

因此,当您在任一对象上调用showCounter时,同一个计数器在StaticClass的唯一实例上得到更新。