Sollte eine Methode, die eine Schnittstellenmethode implementiert, mit Anmerkungen versehen werden @Override
?
Der Javadoc der Override
Anmerkung sagt:
Gibt an, dass eine Methodendeklaration eine Methodendeklaration in einer Oberklasse überschreiben soll. Wenn eine Methode mit diesem Annotationstyp mit Anmerkungen versehen ist, eine Oberklassenmethode jedoch nicht überschreibt, müssen Compiler eine Fehlermeldung generieren.
Ich denke nicht, dass eine Schnittstelle technisch eine Superklasse ist. Oder ist es?
java
oop
interface
annotations
Benno Richters
quelle
quelle
Antworten:
Sie sollten nach Möglichkeit @Override verwenden. Es verhindert, dass einfache Fehler gemacht werden. Beispiel:
Dies wird nicht kompiliert, da es nicht richtig überschrieben wird
public boolean equals(Object obj)
.Gleiches gilt für Methoden, die eine Schnittstelle implementieren (nur 1.6 und höher ) oder die Methode einer Superklasse überschreiben.
quelle
Ich glaube, dass sich das Javac-Verhalten geändert hat - mit 1.5 wurde die Annotation verboten, mit 1.6 nicht. Die Anmerkung bietet eine zusätzliche Überprüfung zur Kompilierungszeit. Wenn Sie also 1.6 verwenden, würde ich mich dafür entscheiden.
quelle
Sie sollten Methoden immer mit Anmerkungen versehen,
@Override
wenn sie verfügbar sind.In JDK 5 bedeutet dies, Methoden von Oberklassen zu überschreiben, in JDK 6 und 7 bedeutet dies, Methoden von Oberklassen zu überschreiben und Methoden von Schnittstellen zu implementieren. Der Grund dafür ist, wie bereits erwähnt, dass der Compiler Fehler abfangen kann, wenn Sie glauben, eine Methode zu überschreiben (oder zu implementieren), aber tatsächlich eine neue Methode definieren (andere Signatur).
Das Beispiel
equals(Object)
vs.equals(YourObject)
ist ein Standardbeispiel, aber das gleiche Argument kann für Schnittstellenimplementierungen angeführt werden.Ich würde mir vorstellen, dass es nicht zwingend erforderlich ist, Implementierungsmethoden für Schnittstellen mit Anmerkungen zu versehen, weil JDK 5 dies als Kompilierungsfehler gekennzeichnet hat. Wenn JDK 6 diese Anmerkung obligatorisch machen würde, würde dies die Abwärtskompatibilität beeinträchtigen.
Ich bin kein Eclipse-Benutzer, aber in anderen IDEs (IntelliJ) wird die
@Override
Anmerkung nur beim Implementieren von Schnittstellenmethoden hinzugefügt, wenn das Projekt als JDK 6+ -Projekt festgelegt ist. Ich würde mir vorstellen, dass Eclipse ähnlich ist.Ich hätte es jedoch vorgezogen, eine andere Anmerkung für diese Verwendung zu sehen, möglicherweise eine
@Implements
Anmerkung.quelle
Ich würde es bei jeder Gelegenheit nutzen. Siehe Wann verwenden Sie die @ Override-Annotation von Java und warum?
quelle
In JDK 5.0 können Sie keine
@Override
Anmerkungen verwenden, wenn Sie eine in der Schnittstelle deklarierte Methode implementieren (deren Kompilierungsfehler), in JDK 6.0 ist dies jedoch zulässig. Möglicherweise können Sie Ihre Projekteinstellungen entsprechend Ihren Anforderungen konfigurieren.quelle
Wenn eine konkrete Klasse eine abstrakte Methode nicht überschreibt , ist die Verwendung
@Override
für die Implementierung eine offene Angelegenheit, da der Compiler Sie ausnahmslos vor nicht implementierten Methoden warnt. In diesen Fällen kann argumentiert werden, dass dies die Lesbarkeit beeinträchtigt - es sind mehr Dinge, die in Ihrem Code gelesen werden müssen, und in geringerem Maße wird es aufgerufen@Override
und nicht@Implement
.quelle
Das Überschreiben Ihrer eigenen Methoden, die von Ihren eigenen Klassen geerbt wurden, wird bei Refactorings mit einer Idee normalerweise nicht unterbrochen. Wenn Sie jedoch eine von einer Bibliothek geerbte Methode überschreiben, wird empfohlen, sie zu verwenden. Wenn Sie dies nicht tun, erhalten Sie bei einer späteren Bibliotheksänderung häufig keinen Fehler, sondern einen gut versteckten Fehler.
quelle
Mit JDK ist das kein Problem. In Eclipse Helios ist die Annotation @Override für implementierte Schnittstellenmethoden zulässig, je nachdem, welches JDK 5 oder 6 vorliegt. Wie bei Eclipse Galileo ist die Annotation @Override nicht zulässig, je nachdem, welches JDK 5 oder 6 vorliegt.
quelle
Für mich ist dies oft der einzige Grund, warum für die Kompilierung von Code Java 6 erforderlich ist. Ich bin mir nicht sicher, ob es sich lohnt.
quelle
Wenn Sie das Javadoc in Java8 lesen, finden Sie Folgendes in der Deklaration der Schnittstelle Override:
Wenn eine Methode mit diesem Annotationstyp kommentiert wird, müssen Compiler eine Fehlermeldung generieren, es sei denn, mindestens eine der folgenden Bedingungen gilt:
Zumindest in Java8 sollten Sie @Override für die Implementierung einer Schnittstellenmethode verwenden.
quelle
Eclipse selbst fügt die
@Override
Annotation hinzu, wenn Sie anweisen, beim Erstellen einer Klasse, die eine Schnittstelle implementiert, "nicht implementierte Methoden zu generieren".quelle
Das Problem beim Einfügen von
@Override
ist, dass Sie denken, Sie hätten vergessen, diesuper.theOverridenMethod()
Methode aufzurufen , was sehr verwirrend ist . Dies sollte kristallklar sein. Vielleicht sollte Java ein anbieten@Interface
, um hier verwendet zu werden. Na ja, noch eine halbherzige Java-Besonderheit ...quelle
In Java 6 und späteren Versionen können Sie
@Override
eine Methode zum Implementieren einer Schnittstelle verwenden.Aber ich halte es nicht für sinnvoll: Überschreiben bedeutet, dass Sie eine Methode in der Superklasse haben und diese in der Unterklasse implementieren.
Wenn Sie eine Schnittstelle implementieren, sollten wir
@Implement
oder etwas anderes verwenden, aber nicht die@Override
.quelle
Für die Schnittstelle verursachte die Verwendung von @Override einen Kompilierungsfehler. Also musste ich es entfernen.
Fehlermeldung ging "
The method getAllProducts() of type InMemoryProductRepository must override a superclass method
".Es lautete auch "
One quick fix available: Remove @Override annotation.
"Es war auf Eclipse 4.6.3, JDK 1.8.0_144.
quelle
Wenn die Klasse, die das implementiert,
interface
eineabstract
Klasse ist,@Override
ist dies hilfreich, um sicherzustellen, dass die Implementierung für eineinterface
Methode ist. Ohne die würde@Override
eineabstract
Klasse nur dann gut kompiliert, wenn die Signatur der Implementierungsmethode nicht mit der in derinterface
; Die nicht übereinstimmendeinterface
Methode würde als nicht implementiert bleiben. Das von @Zhao zitierte Java-Dokumentbezieht sich eindeutig auf eine
abstract
Superklasse; Eininterface
kann nicht als Supertyp bezeichnet werden. Ist@Override
also redundant und fürinterface
Methodenimplementierungen in konkreten Klassen nicht sinnvoll .quelle