¿Por qué Java usa una anotación @Override, en lugar de un modificador?

19

¿Cuáles fueron las motivaciones para que Java usara la @Overrideanotación, en lugar de crear un nuevo overridemodificador?

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

vs.

public override String toString() {
   return "";
}
jwa
fuente
2
Eso fue una ocurrencia tardía.
Tulains Córdova

Respuestas:

21

@Override originalmente no estaba en el idioma. Cuando se sintió la necesidad de agregarlo, fue más fácil usar un mecanismo genérico (anotaciones) que agregar una nueva palabra clave al idioma. Agregar una nueva palabra clave siempre es un cambio incompatible, ya que puede romper los programas que usan esas palabras como identificador.

En los idiomas que agregan un marcador de anulación desde el primer día, a menudo es una palabra clave (por ejemplo, Kotlin y Scala), en Java se trataba de mantener la compatibilidad con versiones anteriores de Java que no tenían ningún marcador de anulación.

Michał Kosmulski
fuente
Parece inconsistente que la anulación sea una anotación, cuando ha habido cambios que han introducido nuevas palabras clave. Por ejemplo, el modificador "predeterminado" para los métodos de interfaz.
jwa
66
@jwa No realmente: defaultya era una palabra clave reservada (utilizada en las declaraciones de cambio), solo le agregaron un nuevo uso. También hay algunas palabras clave que no hacen nada en este momento pero están reservadas para uso futuro (const, goto) - vea JLS §3.9
Michał Kosmulski
3
"ejemplos son Kotlin y Java" parece un error tipográfico aquí, ¿querías escribir, por ejemplo, Scala en lugar de Java?
mosquito
66
Si bien es cierto que agregar palabras clave globales rompe cosas, podría haberse agregado como una palabra clave contextual sin romper el código. se supone que esto no se hizo ya que complicaría un poco el análisis y el mecanismo de anotación fue lo suficientemente bueno
jk.
1
@ MichałKosmulski: Recuerdo que la enumpalabra clave que se agregó rompería el código anterior. Más palabras clave de última hora aquí: stackoverflow.com/questions/16506411
Allon Guralnek
13

No necesita la anotación @Override para anular realmente el comportamiento; Es una anotación porque simplemente agrega algo de contexto de la intención del método para el compilador, no cambia el método en sí.

Sin la anotación, puede tener la intención de anular la funcionalidad, pero accidentalmente no lo hace (mediante el uso de una firma ligeramente diferente). Agregar la anotación le dice al compilador que genere un error si este método no está anulando el comportamiento.

Como tal, tiene perfecto sentido como una anotación.

Eric King
fuente
+1 Tiene sentido que, de forma similar a la desactivación de advertencias a través de anotaciones, también sea posible habilitar advertencias / errores opcionales a través de anotaciones.
Hulk