498 Stimmen

Wann verwenden Sie die @Override-Anmerkung von Java und warum?

Was sind die besten Praktiken für die Verwendung von Javas @Override Anmerkung und warum?

Es scheint, als wäre es übertrieben, jede einzelne überschriebene Methode mit dem @Override Bemerkung. Gibt es bestimmte Programmiersituationen, die die Verwendung der @Override und andere, die niemals die @Override ?

14voto

Um die Vorteile der Compilerprüfung zu nutzen, sollten Sie immer die Override-Anmerkung verwenden. Vergessen Sie aber nicht, dass der Java Compiler 1.5 diese Annotation nicht zulässt, wenn Sie Schnittstellenmethoden überschreiben. Sie können sie nur verwenden, um Klassenmethoden (abstrakt oder nicht) zu überschreiben.

Einige IDEs, wie z.B. Eclipse, selbst wenn sie mit Java 1.6 Runtime oder höher konfiguriert sind, halten sie die Konformität mit Java 1.5 aufrecht und erlauben die Verwendung von @override wie oben beschrieben nicht. Um dieses Verhalten zu vermeiden, müssen Sie gehen zu: Projekteigenschaften ->Java Compiler -> Aktivieren Sie "Projektspezifische Einstellungen aktivieren" -> Wählen Sie "Compiler Compliance Level" = 6.0, oder höher.

Ich verwende diese Annotation immer dann, wenn ich eine Methode unabhängig überschreibe, wenn die Basis eine Schnittstelle oder eine Klasse ist.

Dies hilft Ihnen, einige typische Fehler zu vermeiden, z. B. wenn Sie denken, dass Sie einen Event-Handler überschreiben, und dann sehen Sie, dass nichts passiert. Stellen Sie sich vor, Sie möchten einen Ereignis-Listener zu einer UI-Komponente hinzufügen:

someUIComponent.addMouseListener(new MouseAdapter(){
  public void mouseEntered() {
     ...do something...
  }
});

Der obige Code wird kompiliert und ausgeführt, aber wenn Sie die Maus innerhalb von someUIComponent bewegen, wird der "do something"-Code nicht ausgeführt, weil Sie die Basismethode nicht überschreiben mouseEntered(MouseEvent ev) . Sie erstellen einfach eine neue Methode ohne Parameter mouseEntered() . Wenn Sie anstelle dieses Codes die Option @Override Annotation haben Sie einen Kompilierfehler gesehen und keine Zeit damit verschwendet, darüber nachzudenken, warum Ihr Event-Handler nicht ausgeführt wurde.

8voto

Rune Punkte 89

@Override on Interface-Implementierung ist inkonsistent, da es so etwas wie das "Überschreiben einer Schnittstelle" in Java nicht gibt.

@Override on Interface-Implementierung ist nutzlos, da es in der Praxis keine Fehler findet, die die Kompilierung nicht ohnehin finden würde. Es gibt nur ein weit hergeholtes Szenario, in dem Override auf Implementierer tatsächlich etwas bewirkt: Wenn Sie eine Schnittstelle implementieren und die Schnittstelle Methoden ENTFERNT, werden Sie zur Kompilierzeit benachrichtigt, dass Sie die nicht verwendeten Implementierungen entfernen sollten. Wenn die neue Version der Schnittstelle NEUE oder GEÄNDERTE Methoden hat, erhalten Sie natürlich trotzdem einen Kompilierfehler, da Sie die neuen Methoden nicht implementieren.

@Override auf Interface-Implementierern hätte in 1.6 nie erlaubt sein sollen, und da Eclipse leider die automatische Einfügung der Annotationen als Standardverhalten gewählt hat, erhalten wir eine Menge unübersichtlicher Quelldateien. Wenn man 1.6-Code liest, kann man anhand der @Override-Annotation nicht erkennen, ob eine Methode tatsächlich eine Methode in der Oberklasse überschreibt oder nur eine Schnittstelle implementiert.

Die Verwendung von @Override, wenn eine Methode in einer Oberklasse tatsächlich überschrieben wird, ist in Ordnung.

8voto

erickson Punkte 256579

Es ist am besten, sie für jede Methode zu verwenden, die als Override vorgesehen ist, und in Java 6+ für jede Methode, die als Implementierung einer Schnittstelle vorgesehen ist.

Erstens erkennt es Rechtschreibfehler wie " hashcode() " anstelle von " hashCode() " zur Kompilierzeit. Es kann verwirrend sein, zu debuggen, warum das Ergebnis Ihrer Methode nicht mit Ihrem Code übereinzustimmen scheint, wenn die wahre Ursache darin liegt, dass Ihr Code nie aufgerufen wird.

Wenn eine Oberklasse eine Methodensignatur ändert, können Überschreibungen der älteren Signatur "verwaist" werden und als verwirrender toter Code zurückbleiben. Die @Override hilft Ihnen, diese Waisen zu identifizieren, damit sie an die neue Signatur angepasst werden können.

7voto

Diastrophism Punkte 14352

Außerdem wird beim Lesen des Codes deutlicher, dass er das Verhalten der übergeordneten Klasse ändert. Das kann bei der Fehlersuche helfen.

Auch in Joshua Blocks Buch Effective Java (2. Auflage) finden sich unter Punkt 36 weitere Einzelheiten zu den Vorteilen der Annotation.

7voto

Tom Hawtin - tackline Punkte 142461

Wenn Sie sehr oft (nicht abstrakte) Methoden außer Kraft setzen, sollten Sie Ihr Design überdenken. Es ist sehr nützlich, wenn der Compiler den Fehler sonst nicht erkennen würde. Zum Beispiel, wenn man versucht, initValue() in ThreadLocal zu überschreiben, was ich getan habe.

Die Verwendung von @Override bei der Implementierung von Schnittstellenmethoden (ab Version 1.6) scheint mir etwas übertrieben. Wenn Sie viele Methoden haben, von denen einige überschreiben und einige nicht, das ist wahrscheinlich wieder schlechtes Design (und Ihr Editor wird wahrscheinlich zeigen, was was ist, wenn Sie nicht wissen).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X