我是java新手并试图理解为什么a
即使a++
运行3次但只增加一次也不会增加。
为什么另外两个实例与第一个实例的行为不同,这个原理是做什么的?
https://www.tutorialspoint.com/tpcg.php?p=Y0VNTH
public class ClassicSingleton {
private int a = 0;
static int b = 0;
private static ClassicSingleton instance = null;
private ClassicSingleton() {
a++;
System.out.println(a);
System.out.println("ClassicSingleton() called");
}
public static ClassicSingleton getInstance() {
b++;
System.out.println("b:"+b);
instance = new ClassicSingleton();
return instance;
}
public static void main(String[] args) {
ClassicSingleton tmp = ClassicSingleton.getInstance( );
ClassicSingleton tmp2 = ClassicSingleton.getInstance( );
ClassicSingleton tmp3 = ClassicSingleton.getInstance( );
}
}
答案 0 :(得分:9)
a
是一个实例变量,这意味着您在main方法中创建的三个ClassicSingleton
类中的每一个都有自己的该变量副本,该变量初始化为0(默认情况下)并递增构造函数为1。
BTW,ClassicSingleton
在这里是一个误导性的名称,因为您的ClassicSingleton.getInstance()
会在每次通话时返回一个新实例。即使它在每次调用中返回相同的实例,a
仍然会包含1(因为这次您将有一个ClassicSingleton
实例,a
只会增加一次ClassicSingleton
哦,如果您希望getInstance
成为实际的单身人士,请将public static ClassicSingleton getInstance() {
if (instance == null) {
instance = new ClassicSingleton();
}
return instance;
}
更改为:
users * items
答案 1 :(得分:1)
有两个原因
a
是一个实例变量,仅在一次时增加 - 在构造getInstance
时都会创建一个新实例,它会用新的实例替换共享实例。基本上,您已经实现了经典的单例错误,并实现了工厂方法。要修复单例,请检查instance
是否为空,如果是这样的话,只创建一个新实例。