报错描述
简单记录一个在使用单例模式时因为架构设计而报的错
因为代码过多,我用A和B两个类还原了一下,使用的是饿汉式单例
class A {
private static A INSTANCE = new A();
public static A getInstance(){
return INSTANCE;
}
private A(){
new B();
}
public void m(){
System.out.println("m");
}
}
class B{
public B(){
A.getInstance().m();
}
}
main方法
public static void main(String[] args) {
new B();
System.out.println("ok");
}
报错原因很明显,是因为创建B时需要A的单例,但是A的单例初始化又需要B,成了死循环
解决办法
我们可以回顾一下类的创建过程,在构造方法执行完后会加载静态代码块
所以我们可以加一个init方法给我们的对象A,在A初始化完成后再通过静态代码块加载对象B
class A {
private static A INSTANCE = new A();
static {
init();
}
private static void init(){
new B();
}
public static A getInstance(){
return INSTANCE;
}
private A(){
}
public void m(){
System.out.println("m");
}
}
class B{
public B(){
A.getInstance().m();
}
}
main方法
public static void main(String[] args) {
new B();
System.out.println("ok");
}
输出结果
ok,问题解决!