[英]Order of events lazy loading the class itself
如果我有這個Java類,構造/初始化時事件的順序到底是什么?
class Start {
private Start s = new Start();
public Start(){} //constructor
}
當我調用new Start()
,是否沒有調用某些循環邏輯?
是的,您在這里遇到了StackOverflowError,因為創建Start
的實例會導致在初始化s
成員時創建另一個實例,從而創建另一個實例,依此類推。
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();}
延遲設置字段的一種方法是使用吸氣劑。 例如
class Start {
private Start nested = null;
public Start getNested() {
return nested == null ? nested = new Start() : nested;
}
}
這不是線程安全的,但如果謹慎使用,則可以避免無限循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.