我有一个用java实现的经典单例
public class ClassicSingleton {
private static ClassicSingleton instance = null;
private ClassicSingleton() {} ;
public static ClassicSingleton getInstance() {
if (instance == null)
return new ClassicSingleton();
return instance;
}
}
我有以下驱动程序
public class SingletonDriver {
public static void main(String[] args) {
System.out.println(ClassicSingleton.getInstance().toString());
System.out.println(ClassicSingleton.getInstance().toString());
}
}
输出类似于
ClassicSingleton@75e4f66a
ClassicSingleton@aede59e
我认为输出会指向同一个对象。这些值不应该相同吗?
答案 0 :(得分:5)
您忘记将new ClassicSingleton()
分配给instance
,因此您实际上有一个工厂而不是一个单身人士;你将在每次通话时创建一个新实例。 (当然,请注意,这不是线程安全的。)
答案 1 :(得分:5)
您对getInstance()
的实施是错误的。您永远不会初始化instance
,因此会在每次调用时返回一个新实例。如果instance
为null
,则应将其保存到您的数据成员,然后才返回:
public static ClassicSingleton getInstance() {
if (instance == null)
instance = new ClassicSingleton();
return instance;
}