2016-04-06 7 views
9

、項目17:継承を計画するとき、コンストラクタはオーバーライド可能なメソッドを呼び出すことができますか?効果的なJavaの第2版から

各パブリックまたは保護されたメソッドまたはコンストラクタについては、ドキュメント はメソッドまたはコンストラクタ 後で同じで

を呼び出すオーバーライドされた方法を示さなければなりません項目:

コンストラクターは、オーバーライド可能なメソッドを直接的または間接的に呼び出さないでください。

これらの2つのステートメントは矛盾していないのですか、何か不足していますか?

+0

オーバーライド可能なメソッドが呼び出されていない場合、すべてのオーバーライド可能なメソッドが呼び出されたことをコンストラクタのドキュメントが示しているかどうかは不明です。しかし、それはそれが書かれた精神でもなく、あなたが意味するものでもないと思われます。 –

+0

あなたが呼び出す優先メンバーを文書化して、誰かが上書きできるようにしておき、その後は言うことができません。 > "ねえ、これを上書きするようには知らなかったし、 >副作用がない" それ以外にも、(上書きされた)クラスでメソッドを変更している人がいるので、コードが壊れる可能性があるこれを決して行うことは最善ではありません。 – Stultuske

答えて

1

建設中のオーバーライド可能なメソッドの呼び出しは、です。許可された - これは違法ではありません。建設中にオーバーライドメソッドの呼び出し

ことをお勧めではない - それは一般公開されるように、これは不完全なオブジェクトを引き起こす可能性があるので、施工時のオーバーライドメソッドを呼び出すために無分別であり、システムの予測可能性を制限します。

public class A { 

    final int a; 

    public A() { 
     a = method(); 
    } 

    protected int method() { 
     return 42; 
    } 

    @Override 
    public String toString() { 
     return "A{" + "a=" + a + '}'; 
    } 

} 

public class B extends A { 

    @Override 
    protected int method() { 
     System.out.println("this=" + this); 
     return 96; 
    } 

} 

public void test() { 
    System.out.println("B = " + new B()); 
} 

最初の引用は、コードではなくドキュメントを参照していることに注意してください。私は唯一の問題は、の使用がの場合で、の場合はの方が適切かもしれないことを示唆しています。

関連する問題