簡體   English   中英

延遲加載類本身的事件順序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM