2015-03-23 16 views
7

Bitte schauen Sie sich link von Joshua Blochs Effektivem Java an.Entspricht der Methode in Joshua Blochs Effektivem Java

Im zweiten Absatz, der Autor sagt:

Die Klasse ist privat oder Paket-privat, und Sie sind sicher, dass seine Methode equals nie aufgerufen werden. Argumentieren, die equals Methode sollte unter diesen Umständen außer Kraft gesetzt werden, falls es versehentlich aufgerufen:

@Override public boolean equals(Object o) { 
    throw new AssertionError(); // Method is never called 
} 

diese Bitte erläutern. Ich bin verwirrt durch die Verwendung des Begriffs private Klasse durch den Autor und warum ist es notwendig, die equals-Methode zu überschreiben, wenn wir sicher wissen, dass sie nicht aufgerufen wird.

+1

Zugriff auf diese Seite nicht möglich. Melden Sie den wichtigen Teil. –

+0

Sir, hier ist ein weiterer Link zu diesem Artikel http: //jtechies.blogspot.in/2012/07/item-8-obey-general-contract-when.html \ – user961690

+2

Sie: * "Wenn wir sicher wissen, dass es wird nicht aufgerufen "*; Joshua Bloch: * "falls es versehentlich aufgerufen wird" *. Hast du noch eine Frage? – Tom

Antwort

8

Eine Klasse kann nur dann privat sein, wenn sie eine innere Klasse ist.

Wie für das „Warum“ ist es notwendig equals außer Kraft zu setzen, der Grund ist, dass es durch das Schreiben, wie Sie gezeigt haben, werden Sie sicherstellen, dass das Verfahren niemals absichtlich genannt wird. Der Moment sechs Monate in der Zukunft, wenn ein neuer Entwickler auf dem Projekt gleich auf dieser Klasse anruft, wird die Methode werfen und signalisieren, dass es nicht korrekt ist, es anzurufen. Das ist gut; es verhindert das "Vergessen" darüber.

+1

Ihre erste Aussage ist ungenau. Die Klasse muss nicht nur innerlich sein (verschachtelte Klassen können sicherlich privat sein), sie kann auch eine Klasse der obersten Ebene in derselben Kompilierungseinheit wie eine andere Klasse sein. – chrylis

+0

Sie sind in Bezug auf verschachtelte Klassen richtig; Ich habe "inner" geschrieben, aber ich meinte beides. Allerdings kann ich nicht scheinen, dass Ihr zweiter Fall funktioniert: [this gist] (https://gist.github.com/andreabergia/6aeb123b7474a5822ef6), wenn er als MainClass.java gespeichert wird, scheint nicht zu kompilieren. –

+0

Das Zitat aus dem Buch ist * "privat oder Paket-privat" *, also gilt auch hier eine Paket-private Top-Level-Klasse in der gleichen Kompilierungseinheit. – Radiodef