返回信息流```Java
public class DeadSingleton {
private static final class LazyInitialization {
private static DeadSingleton deadSingleton = new DeadSingleton();
}
public static DeadSingleton getDeadSingleton() {
return LazyInitialization.deadSingleton;
}
private DeadSingleton() {
dependency=new Dependency();
}
private Dependency dependency;
public static void main(String[] args){
System.out.println(DeadSingleton.getDeadSingleton().dependency.deadSingleton);
}
}
class Dependency {
DeadSingleton deadSingleton = DeadSingleton.getDeadSingleton();
Dependency() {
}
}
```
输出结果是:null
为什么结果会是null,单例写错了吗?
这是一条镜像帖。来源:北邮人论坛 / java / #56541同步于 2017/6/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
奇怪的单例
liuyehcf
2017/6/7镜像同步14 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
DeadSingleton.getDeadSingleton() 不会调用DeadSingleton的构造函数,所以dependency为null
另外,这个单例写的有点绕
【 在 liuyehcf 的大作中提到: 】
: [md]
: ```Java
: public class DeadSingleton {
: ...................
DeadSingleton的单例已经生成了,因该是用DeadSingleton.getDeadSingleton()获取即可。
Dependency 的实例对象生成时,由于DeadSingleton.getDeadSingleton()还没有执行结束,也就是说还没有DeadSingleton对象生成成功,因此赋值为null,因此DeadSingleton.getDeadSingleton().dependency.deadSingleton的取法只能取到null。
谢谢~,好像明白了
```Java
System.out.println(DeadSingleton.getDeadSingleton().dependency.deadSingleton);
```
我的理解是
1、DeadSingleton:加载DeadSingleton
2、DeadSingleton.getDeadSingleton():加载静态内部类LazyInitialization,此时生成了DeadSingleton的对象
3、生成DeadSingleton的对象的时候,会执行dependency字段的初始化语句,然后反过来又调用DeadSingleton.getDeadSingleton(),这时候返回了null
【 在 superccf 的大作中提到: 】
: DeadSingleton的单例已经生成了,因该是用DeadSingleton.getDeadSingleton()获取即可。
: Dependency 的实例对象生成时,由于DeadSingleton.getDeadSingleton()还没有执行结束,也就是说还没有DeadSingleton对象生成成功,因此赋值为null,因此DeadSingleton.getDeadSingleton().dependency.deadSingleton的取法只能取到null。
DeadSingleton 类加载
getDeadSingleton 进入方法
LazyInitialization 加载,开始初始化静态变量
DeadSingleton 对象初始化开始
Dependency 类加载
getDeadSingleton 进入方法
Dependency 对象实例化 dependency.deadSingleton=null
LazyInitialization.deadSingleton 对象实例化完成
LazyInitialization 初始化结束
【 在 liuyehcf 的大作中提到: 】
: 谢谢~,好像明白了
: [md]
: ```Java
: ...................