如果我有这个Java类,那么构造/初始化时事件的顺序究竟是什么?
class Start {
private Start s = new Start();
public Start(){} //constructor
}
当我致电new Start()
时,是否有一些循环逻辑被调用?
答案 0 :(得分:3)
是的,你在这里得到了一个StackOverflowError,因为创建Start
的实例会导致在s
成员初始化时创建另一个isntance,这会创建另一个实例,依此类推。
private Start s = new Start();
public Start(){}
表现为:
private Start s;
public Start() {s = new Start();}
要避免此类无限构造函数调用,可以将Start
的实例传递给构造函数,或者可以通过其他方法初始化s
成员:
private Start s;
public Start(Start s) {this.s = s;}
或
private Start s;
public Start() {}
public initS () {s = new Start();}
答案 1 :(得分:1)
懒惰设置字段的方法是使用getter。 e.g。
class Start {
private Start nested = null;
public Start getNested() {
return nested == null ? nested = new Start() : nested;
}
}
这不是线程安全的,但如果小心使用,则避免无限循环。