2013-10-09 26 views
0

我一直在閱讀Joshua Bloch的Effective Java,它明確指出非final方法不應該在構造函數中調用,我明白爲什麼調用它們可能會成爲問題。從LinkedList的構造函數調用non-final addAll方法

當我閱讀openjdk代碼並發現在LinkedList的「複製構造函數」中調用了非final方法addAll(從AbstractCollection繼承)時,我感到驚訝。

如果Java編寫者自己做到這一點,那麼肯定會出現這樣的情況,其中安全。什麼時候安全?如果我定義了另一個集合類,我可以在構造函數中調用addAll嗎?

+2

有沒有作者提供的理由也爲「非最終方法不應該在構造函數中調用」的說法? –

+2

請參閱:http://stackoverflow.com/a/3404369/982149 – Fildor

+0

可能重複[在構造函數中重寫的方法調用有什麼問題?](http://stackoverflow.com/questions/3404301/whats-wrong-with- overridable-method-calls-in-constructors) –

回答

0

好問題。簡而言之,只有在重寫的方法不依賴於子類的初始化的情況下,纔可以在某些情況下使用。在下面的示例中,輸出爲0,因爲childvar變量已創建,但是分配初始值int childvar = 1的行和Child構造函數中的賦值尚未執行。另一方面,如果只使用Parent環境,則可以。它可能會導致意想不到的結果,很難調試錯誤,所以我建議你只用它,如果它真的節省了很多時間並且要小心,這很棘手。

abstract class Parent { 
    protected int parentvar = 2; 

    public Parent() { 
    invokeMethod(); 
    } 

    public abstract void invokeMethod(); 

    public static void main(String[] args) { 
     new Child(); 
    } 
} 

class Child extends Parent { 
    protected int childvar = 1; 

    public Child() { 
    super(); 
    childvar = 2; 
    } 

    public void invokeMethod() { 
    System.out.println("" + childvar); 
    } 
} 
相關問題