延迟加载类本身的事件顺序

时间:2015-05-05 20:38:45

标签: java

如果我有这个Java类,那么构造/初始化时事件的顺序究竟是什么?

class Start {

private Start s = new Start();

public Start(){} //constructor

}

当我致电new Start()时,是否有一些循环逻辑被调用?

2 个答案:

答案 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;
    }
}

这不是线程安全的,但如果小心使用,则避免无限循环。