2016-04-06 18 views
9

Von Effective Java 2. Auflage, Artikel 17:Wenn Konstrukteure die Vererbung planen, dürfen sie eine überschreibbare Methode aufrufen?

Für jede öffentliche oder Methode oder Konstruktor geschützt, muss die Dokumentation

welche overridable Methoden die Methode oder Konstruktor zeigen

Später im selben ruft Item it says:

Konstruktoren dürfen keine überschreibbaren Methoden direkt oder indirekt aufrufen.

Sind diese beiden Aussagen nicht widersprüchlich, oder fehle ich etwas?

+0

Sie können es in einem Sinne lesen, der nicht widersprüchlich ist: es kann vakuumlos wahr sein Die Dokumentation eines Konstruktors zeigt alle aufgerufenen überschreibbaren Methoden an, wenn null überschreibbare Methoden aufgerufen werden. Aber ich vermute, das ist nicht der Geist, in dem es geschrieben wurde, noch der, den du meinst :) –

+0

Nicht wirklich, du solltest dokumentieren, welche Overridable-Mitglieder du aufrufst, nur damit jemand sie überschreiben kann, und danach kann er nicht sagen > "hey, aber du hast mich nie darüber informiert, dass dies oder das nicht hätte > irgendwelche Nebenwirkungen" Abgesehen davon wird es immer Leute geben, die Methoden in ihren (überschriebenen) Klassen ändern, die Ihren Code brechen könnten, so dass es ist am besten, dies nie zu tun. – Stultuske

Antwort

1

Aufrufen von Overridable Methoden während des Baus ist Erlaubt - es gibt nichts, was illegal ist.

overridable Methoden beim Bau Aufruf ist abzuraten - Es ist in der Regel schlecht beraten overridable Methoden während der Bauphase berufen, weil diese unvollständige Objekte verursachen kann die Berechenbarkeit des Systems ausgesetzt und beschränkt werden.

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()); 
} 

Beachten Sie, dass sich Ihr erstes Angebot nur auf die Dokumentation bezieht, nicht auf den Code. Ich würde vorschlagen, das einzige Problem ist die Verwendung von muss, wenn sollte wäre wahrscheinlich angemessener.