Warum verwendet Java eine @ Override-Annotation anstelle eines Modifikators?

19

Was war die Motivation für Java, die @OverrideAnnotation zu verwenden, anstatt einen neuen overrideModifikator zu erstellen ?

@Override
public String toString() {
   return "";
}

gegen

public override String toString() {
   return "";
}
jwa
quelle
2
Das war ein nachträglicher Gedanke.
Tulains Córdova

Antworten:

21

@Override war ursprünglich nicht in der Sprache. Wenn das Bedürfnis bestand, es hinzuzufügen, war es einfacher, einen generischen Mechanismus (Anmerkungen) zu verwenden, als der Sprache ein neues Schlüsselwort hinzuzufügen. Das Hinzufügen eines neuen Schlüsselworts ist immer eine inkompatible Änderung, da Programme, die diese Wörter als Bezeichner verwenden, beschädigt werden können.

In Sprachen, die ab dem ersten Tag einen Override-Marker hinzufügen, handelt es sich häufig um ein Schlüsselwort (Beispiele sind Kotlin und Scala). In Java ging es darum, mit älteren Java-Versionen, die keinen Override-Marker hatten, abwärtskompatibel zu bleiben.

Michał Kosmulski
quelle
Es scheint inkonsistent, dass Überschreiben eine Anmerkung ist, wenn Änderungen vorgenommen wurden, die neue Schlüsselwörter eingeführt haben. Zum Beispiel der Modifikator "default" für Schnittstellenmethoden.
JWA
6
@jwa Nicht wirklich: War defaultbereits ein reserviertes Schlüsselwort (in switch-Anweisungen verwendet) - es wurde nur eine neue Verwendung hinzugefügt. Es gibt auch einige Schlüsselwörter, die im Moment
nichts
3
"Beispiele sind Kotlin und Java" sieht hier wie ein Tippfehler aus, wollten Sie zB Scala anstelle von Java schreiben?
gnat
6
Es ist zwar richtig, dass das Hinzufügen globaler Schlüsselwörter zu Problemen führt, diese könnten jedoch als kontextbezogenes Schlüsselwort hinzugefügt werden, ohne den Code zu beschädigen. man nimmt an, dass dies nicht getan wurde, da dies das Parsen geringfügig erschweren würde und der Annotationsmechanismus ausreichend gut war
jk.
1
@ MichałKosmulski: Ich erinnere mich, enumdass das hinzugefügte Schlüsselwort älteren Code beschädigen würde. Weitere wichtige
Allon Guralnek
13

Sie benötigen die @ Override-Annotation nicht , um das Verhalten tatsächlich zu überschreiben. Es handelt sich um eine Anmerkung, da lediglich ein Kontext der Methodenabsicht für den Compiler hinzugefügt wird, ohne die Methode selbst zu ändern.

Ohne die Anmerkung können Sie beabsichtigen , die Funktionalität zu überschreiben, dies jedoch versehentlich nicht tun (indem Sie eine etwas andere Signatur verwenden). Durch Hinzufügen der Anmerkung wird der Compiler angewiesen, einen Fehler zu generieren, wenn diese Methode das Verhalten nicht überschreibt.

Insofern macht es als Annotation durchaus Sinn.

Eric King
quelle
+1 Es ist sinnvoll, dass ähnlich wie beim Deaktivieren von Warnungen durch Anmerkungen auch optionale Warnungen / Fehler durch Anmerkungen aktiviert werden können.
Hulk