Sollte eine Methode, die eine Schnittstellenmethode implementiert, mit @Override
kommentiert werden?
Das Javadoc der Override
Annotation sagt:
Gibt an, dass eine Methodendeklaration eine Methodendeklaration in einer Oberklasse überschreiben soll. Wenn eine Methode mit diesem Annotationstyp annotiert wird, jedoch keine übergeordnete Klasse überschreibt, müssen Compiler eine Fehlermeldung generieren.
Ich denke nicht, dass eine Schnittstelle technisch eine Superklasse ist. Oder ist es?
Sie sollten @Override wann immer möglich verwenden. Es verhindert, dass einfache Fehler gemacht werden. Beispiel:
class C {
@Override
public boolean equals(SomeClass obj){
// code ...
}
}
Dies wird nicht kompiliert, da es public boolean equals(Object obj)
nicht richtig überschreibt.
Das Gleiche gilt für Methoden, die eine Schnittstelle implementieren (nur 1.6 und höher) oder die Methode einer Super-Klasse überschreiben.
Ich glaube, dass sich das Verhalten von Javac geändert hat - mit 1.5 wurde die Annotation verboten, mit 1.6 nicht. Die Annotation bietet eine zusätzliche Überprüfung der Kompilierungszeit. Wenn Sie also 1.6 verwenden, würde ich dies tun.
Sie sollten Methoden immer mit @Override
versehen, sofern verfügbar.
In JDK 5 bedeutet dies das Überschreiben von Superklasse-Methoden, in JDK 6 und 7 das Überschreiben von Superklasse-Methoden und das Implementieren von Schnittstellen. Der Grund dafür ist, wie bereits erwähnt, dass der Compiler Fehler abfangen kann, wenn Sie der Meinung sind, dass Sie eine Methode überschreiben (oder implementieren), aber tatsächlich eine neue Methode definieren (andere Signatur).
Das Beispiel equals(Object)
vs. equals(YourObject)
ist ein typisches Beispiel, aber für Schnittstellenimplementierungen kann dasselbe Argument verwendet werden.
Ich kann mir vorstellen, dass es nicht zwingend ist, die Implementierungsmethoden von Schnittstellen zu kommentieren, weil JDK 5 dies als Kompilierungsfehler gekennzeichnet hat. Wenn JDK 6 diese Annotation obligatorisch macht, würde dies die Abwärtskompatibilität beeinträchtigen.
Ich bin kein Eclipse-Benutzer, aber in anderen IDEs (IntelliJ) wird die Annotation @Override
nur bei der Implementierung von Schnittstellenmethoden hinzugefügt, wenn das Projekt als JDK 6+ -Projekt festgelegt ist. Ich könnte mir vorstellen, dass Eclipse ähnlich ist.
Ich hätte jedoch vorgezogen, für diese Verwendung eine andere Anmerkung zu sehen, möglicherweise eine @Implements
-Anmerkung.
Ich würde es bei jeder Gelegenheit nutzen. Siehe Wann verwenden Sie die @Override-Annotation von Java und warum?
In JDK 5.0 können Sie die @Override
-Annotation nicht verwenden, wenn Sie eine in interface deklarierte Methode implementieren (deren Kompilierungsfehler), JDK 6.0 jedoch zulässt. Möglicherweise können Sie also Ihre Projektpräferenz Ihren Anforderungen entsprechend konfigurieren.
Mit JDK ist das kein Problem. In Eclipse Helios ermöglicht es die Annotation @Override für implementierte Schnittstellenmethoden, je nachdem, welches JDK 5 oder 6 verwendet wird. Was Eclipse Galileo angeht, ist die Annotation @Override nicht zulässig, unabhängig von JDK 5 oder 6.
Das Überschreiben der eigenen Methoden, die von den eigenen Klassen übernommen wurden, führt bei Refactorings, die eine Ide verwenden, normalerweise nicht. 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 oft keine Fehlermeldung, aber einen gut versteckten Fehler.
Für mich ist dies oft der einzige Grund, warum für die Erstellung von Code Java 6 erforderlich ist. Nicht sicher, ob es das wert ist.
Wenn eine concrete -Klasse keine überschreibende eine abstrakte Methode ist, ist die Verwendung von @Override
für Implementation eine offene Angelegenheit, da der Compiler Sie immer vor unimplementierten Methoden warnt. In diesen Fällen kann ein Argument gemacht werden, dass die Lesbarkeit beeinträchtigt wird. Es ist mehr zu lesen, was in Ihrem Code zu lesen ist, und in einem geringeren Maße heißt es @Override
und nicht @Implement
.
Eclipse selbst fügt die Annotation @Override
hinzu, wenn Sie während der Erstellung einer Klasse, die eine Schnittstelle implementiert, "unimplementierte Methoden generieren" sagen.
Durch Lesen des Javadoc in Java8 können Sie Folgendes bei der Deklaration der Schnittstelle Override finden:
Wenn eine Methode mit diesem Annotationstyp kommentiert wird, müssen Compiler eine Fehlermeldung generieren, sofern nicht mindestens eine der folgenden Bedingungen erfüllt ist:
Zumindest in Java8 sollten Sie @Override für eine Implementierung einer Schnittstellenmethode verwenden.
In Java 6 und höheren Versionen können Sie @Override
für eine Methode verwenden, die eine Schnittstelle implementiert.
Aber ich denke nicht, dass es sinnvoll ist: Überschreiben bedeutet, dass Sie eine Methode in der Superklasse haben und Sie in der Unterklasse implementieren.
Wenn Sie eine Schnittstelle implementieren, sollten Sie @Implement
oder etwas anderes verwenden, nicht jedoch @Override
.
Das Problem beim Einschließen von @Override
besteht darin, dass Sie denken, dass Sie vergessen haben, die super.theOverridenMethod()
-Methode aufzurufen, die sehr verwirrend ist. Dies sollte kristallklar sein. Vielleicht sollte Java einen @Interface
anbieten, der hier verwendet werden soll. Na ja, noch eine halbherzige Java-Besonderheit ...
Bei der Schnittstelle verursachte die Verwendung von @Override einen Kompilierungsfehler. Also musste ich es entfernen.
Fehlermeldung wurde "The method getAllProducts() of type InMemoryProductRepository must override a superclass method
".
Es liest auch "One quick fix available: Remove @Override annotation.
"
Es war am Eclipse 4.6.3, JDK 1.8.0_144.
Wenn die Klasse, die interface
implementiert, eine abstract
-Klasse ist, ist @Override
hilfreich, um sicherzustellen, dass die Implementierung für eine interface
-Methode ist. Ohne @Override
würde eine abstract
-Klasse auch dann kompiliert, wenn die Signatur der Implementierungsmethode nicht mit der in interface
deklarierten Methode übereinstimmt. Die nicht übereinstimmende interface
-Methode bleibt unimplementiert . Das von @Zhao zitierte Java-Dokument
Die Methode überschreibt oder implementiert eine in einem Supertyp deklarierte Methode
bezieht sich eindeutig auf eine abstract
-Superklasse; Eine interface
kann nicht als Supertyp bezeichnet werden . Daher ist @Override
redundant und für die Implementierung von interface
-Methoden in konkreten Klassen nicht sinnvoll.