it-swarm.com.de

Würdest du die Methodenimplementierung einer Schnittstelle überschreiben?

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?

Question Elaboration

403
Benno Richters

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.

273
jjnguy

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.

98
Jon Skeet

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.

57
GKelly

Ich würde es bei jeder Gelegenheit nutzen. Siehe Wann verwenden Sie die @Override-Annotation von Java und warum?

15
Alex B

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. 

11
Silent Warrior

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.

3
lwpro2

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.

3
Arne Burmeister

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.

2
Fabian Steeg

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.

2
juanchito

Eclipse selbst fügt die Annotation @Override hinzu, wenn Sie während der Erstellung einer Klasse, die eine Schnittstelle implementiert, "unimplementierte Methoden generieren" sagen.

1

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:

  • Die Methode überschreibt oder implementiert eine in einem Supertyp deklarierte Methode.
  • Die Methode hat eine Signatur, die der aller öffentlichen Methoden, die in {@linkplain Object} deklariert sind, überschreibt.

Zumindest in Java8 sollten Sie @Override für eine Implementierung einer Schnittstellenmethode verwenden.

1
Zhao Pengfei

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

1
ZhaoGang

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 ...

1
spujia

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.

0
Park JongBum

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.

0
Madhu