Pourquoi Java utilise-t-il une annotation @Override, au lieu d'un modificateur?

19

Quelles étaient les motivations de Java pour utiliser l' @Overrideannotation, au lieu de créer un nouveau overridemodificateur?

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

contre.

public override String toString() {
   return "";
}
jwa
la source
2
C'était une réflexion après coup.
Tulains Córdova

Réponses:

21

@Override n'était pas à l'origine dans la langue. Lorsque le besoin s'est fait sentir de l'ajouter, il était plus facile d'utiliser un mécanisme générique (annotations) que d'ajouter un nouveau mot-clé à la langue. L'ajout d'un nouveau mot-clé est toujours un changement incompatible car il peut casser des programmes qui utilisent ces mots comme identifiant.

Dans les langues qui ajoutent un marqueur de remplacement dès le premier jour, il s'agit assez souvent d'un mot-clé (des exemples sont Kotlin et Scala), en Java, il s'agissait de rester rétrocompatible avec l'ancienne version de Java qui n'avait pas de marqueur de remplacement.

Michał Kosmulski
la source
Il semble incohérent que la substitution soit une annotation, lorsqu'il y a eu des changements qui ont introduit de nouveaux mots clés. Par exemple, le modificateur "par défaut" pour les méthodes d'interface.
jwa
6
@jwa Pas vraiment: defaultétait déjà un mot-clé réservé (utilisé dans les instructions switch) - ils viennent d'en ajouter une nouvelle utilisation. Il y a aussi quelques mots clés qui ne font rien pour l'instant mais qui sont réservés pour une utilisation future (const, goto) - voir JLS §3.9
Michał Kosmulski
3
"Les exemples sont Kotlin et Java" ressemble à une faute de frappe ici, vouliez-vous écrire par exemple Scala au lieu de Java?
moucher
6
S'il est vrai que l'ajout de mots clés globaux rompt les choses, il aurait pu être ajouté en tant que mot clé contextuel sans casser le code. on suppose que cela n'a pas été fait car cela compliquerait légèrement l'analyse et le mécanisme d'annotation était suffisamment bon
jk.
1
@ MichałKosmulski: Je me souviens que le enummot-clé qui a été ajouté romprait l'ancien code. Plus de mots clés de rupture ici: stackoverflow.com/questions/16506411
Allon Guralnek
13

Vous n'avez pas besoin de l' annotation @Override pour remplacer réellement le comportement; C'est une annotation, car elle ajoute simplement un certain contexte de l'intention de la méthode pour le compilateur, sans changer la méthode elle-même.

Sans l'annotation, vous pouvez avoir l' intention de remplacer la fonctionnalité, mais échouez accidentellement (en utilisant une signature légèrement différente). L'ajout de l'annotation indique au compilateur de générer une erreur si cette méthode ne remplace pas réellement le comportement.

En tant que tel, il est parfaitement logique en tant qu'annotation.

Eric King
la source
+1 Il est logique que, tout comme la désactivation des avertissements par le biais d'annotations, il soit également possible d'activer les avertissements / erreurs facultatifs par le biais d'annotations.
Hulk