2015-05-05 14 views
5

Es gilt auf Methoden @Override Anmerkung zuFehlende @Override in Java Bibliotheken

Einsatz eine gute Praxis zu sein, die in Unterklasse außer Kraft gesetzt werden.

Aber warum wird dasselbe nicht auf die Klassen angewendet, die mit Java Library geliefert werden. Für z.B. String-Klasse. Sie überschreibt Methoden der Object-Klasse, verwendet jedoch keine @Override Annotation für diese Methoden.

Ist das so die Abwärtskompatibilität mit früheren Versionen von Java zu erhalten wie 1.4 usw.

Dank

+0

Sir, diese Frage von mir ist kein Duplikat der Frage Wann verwenden Sie Javas Override-Annotation und warum? Weil ich fragen musste, warum Override nicht in Java-Bibliotheken verwendet wird – Ankit

+1

@Ankit Die Bibliotheken kamen zuerst, die Anmerkungen kamen später. Sie hatten wahrscheinlich keinen Hochschulabsolventen oder Praktikanten, um den gesamten Bibliothekscode durchzugehen, nur um Override-Annotationen hinzuzufügen: P – MadProgrammer

+0

@Anpassen, dass Sie Recht haben - scheint ausreichend anders zu sein - den Anspruch fallen zu lassen. – YoYo

Antwort

4

Das ist nicht viel eher ein kosmetisches Anmerkung, es ist sinnvoll, wenn Dokumentation zu erzeugen, gibt Hinweise durch Ihre Java-IDE und explizit anzugeben, wenn eine Methode überschrieben wird.

Aus Sicht der Laufzeit/Standard-Bibliotheks-Implementierer war es nicht den Aufwand wert, alle vorhandenen Klassen zu modifizieren, nur um etwas kosmetisches hinzuzufügen.

Weiterhin in Bezug auf die Abwärtskompatibilität von Anmerkungen im Allgemeinen unter Berücksichtigung, dass Anmerkungen Attribut optional und erweiterten sind in .class-Datei (wenn ihre Aufbewahrungsrichtlinien entweder CLASS oder RUNTIME und für Class und Method als Runtime(In)VisibleAnnotations und für Parameter als Runtime(In)VisibleParameterAnnotations) frühere Releases der JVM würden dieses Attribut während der Dateiparserstellung .class einfach ignorieren, wenn die Klasse zum ersten Mal benötigt wird.

Aber eigentlich, dass 1.4 JVM Klasse Parser nicht einmal den Punkt erreicht, wo diejenigen Annotation .class Attribut innerhalb der Struktur befinden, weil das Parsen abrupt enden wird, wenn die JVM wird feststellen, dass die .class Version größer als die unterstützt.

3

@override Annotation wird verwendet, um einige zusätzliche Informationen bereitzustellen, hauptsächlich beim Generieren von Dokumentationen und auch um den Entwickler darüber zu informieren, dass der Code eine Methode aus der Oberklasse überschreiben möchte.

Dies wird in Oracle-Dokumentation erwähnt.

@Override @Override Anmerkung informiert den Compiler, dass das Element gemeint ist ein Element in einer Oberklasse deklariert außer Kraft zu setzen. Overriding Methoden werden in Schnittstellen und Vererbung diskutiert.

// Markierung Methode als übergeordnete Klasse Methode //, das war überschrieben @Override int overriddenMethod() {}

Obwohl es nicht erforderlich ist, diese Anmerkung zu verwenden, wenn eine Methode überschrieben, hilft es, zu verhindern, Fehler. Wenn eine mit @Override markierte Methode eine Methode in einer ihrer Oberklassen nicht korrekt überschreibt, generiert der Compiler einen Fehler.

Beziehen Sie sich auf discussion in SO selbst.

+0

Danke für Ihre Antwort Sir – Ankit

4

Innerhalb einer API bietet es dem Benutzer (dieser API) nicht viel. Wenn Sie jedoch eine Methode implementieren und die Absicht einer Superklasse außer Kraft setzt, ist es leicht, die Methodensignatur zu übersehen, die übereinstimmen soll.

In diesem Fall kommt die @Override zur Rettung wie zum Kompilieren Zeit, es wird fehlschlagen oder eine Warnung geben, wenn die Überschreibung nicht geschieht. Auch viele IDEs erkennen die.und geben Ihnen genug Unterstützung, um diese Situationen zu kennzeichnen und zu korrigieren, bevor Sie sogar kompilieren.

So die erklärt im Wesentlichen Ihre Absicht, dass diese Methode etwas außer Kraft setzt. Der Benutzer der API kümmert sich weniger, was Ihre Absicht ist, solange es funktioniert.

Eigentlich ist wahrscheinlich der wahre Grund dafür: Die Retention der @Override Annotation ist auf SOURCE eingestellt. Dies bedeutet, dass das Flag.verworfen wird, wenn es in eine Klassendatei kompiliert wird.

@Target(value=METHOD) 
@Retention(value=SOURCE) 
public @interface Override 
+0

Danke für Ihre Antwort Sir – Ankit