Perché java usa un'annotazione @Override, anziché un modificatore?


19

Quali sono stati i motivi per cui java ha usato l' @Overrideannotazione, invece di creare un nuovo overridemodificatore?

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

vs.

public override String toString() {
   return "";
}

2
È stato un ripensamento.
Tulains Córdova,

Risposte:


21

@Override non era originariamente nella lingua. Quando si sentiva la necessità di aggiungerlo, era più facile usare un meccanismo generico (annotazioni) che aggiungere una nuova parola chiave alla lingua. L'aggiunta di una nuova parola chiave è sempre una modifica incompatibile poiché può interrompere i programmi che utilizzano tali parole come identificatore.

Nelle lingue che aggiungono un marcatore di override fin dal primo giorno, è abbastanza spesso una parola chiave (esempi sono Kotlin e Scala), in Java si trattava di rimanere retrocompatibile con la versione precedente di Java che non aveva alcun marcatore di override.


Sembra incoerente che l'override sia un'annotazione, quando ci sono state modifiche che hanno introdotto nuove parole chiave. Ad esempio il modificatore "predefinito" per i metodi di interfaccia.
jwa,

6
@jwa Non proprio: defaultera già una parola chiave riservata (utilizzata nelle istruzioni switch) - hanno appena aggiunto un nuovo uso. Ci sono anche alcune parole chiave che non fanno nulla in questo momento ma sono riservate per un uso futuro (const, goto) - vedi JLS §3.9
Michał Kosmulski,

3
"Gli esempi sono Kotlin e Java" sembra un errore di battitura qui, intendevi scrivere ad esempio Scala invece di Java?
moscerino il

6
mentre è vero che l'aggiunta di parole chiave globali interrompe le cose, avrebbe potuto essere aggiunto come parola chiave contestuale senza interrompere il codice. si presume che ciò non sia stato fatto poiché complicherebbe leggermente l'analisi e il meccanismo di annotazione era sufficientemente buono
jk.

1
@ MichałKosmulski: ricordo che la enumparola chiave aggiunta avrebbe spezzato il codice precedente. Più rompendo le parole chiave qui: stackoverflow.com/questions/16506411
Allon Guralnek

13

Non è necessaria l' annotazione @Override per sovrascrivere effettivamente il comportamento; È un'annotazione perché sta semplicemente aggiungendo un contesto dell'intento del metodo per il compilatore, non modificando il metodo stesso.

Senza l'annotazione, si può intendere alla funzionalità di override, ma accidentalmente non riuscire a farlo (utilizzando una firma leggermente diverso). L'aggiunta dell'annotazione indica al compilatore di generare un errore se questo metodo non sta effettivamente ignorando il comportamento.

Come tale, ha perfettamente senso come un'annotazione.


+1 Ha senso che in modo simile alla disabilitazione degli avvisi tramite annotazioni sarebbe anche possibile abilitare avvisi / errori opzionali tramite annotazioni.
Hulk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.