Por que o java usa uma anotação @Override, em vez de um modificador?


19

Quais foram as motivações para o java usar a @Overrideanotação, em vez de criar um novo overridemodificador?

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

vs.

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

2
Isso foi uma reflexão tardia.
Tulains Córdova

Respostas:


21

@Override não estava originalmente no idioma. Quando sentimos a necessidade de adicioná-lo, era mais fácil usar um mecanismo genérico (anotações) do que adicionar uma nova palavra-chave ao idioma. A adição de uma nova palavra-chave é sempre uma alteração incompatível, pois pode interromper os programas que usam essas palavras como identificador.

Nas linguagens que adicionam um marcador de substituição desde o primeiro dia, muitas vezes é uma palavra-chave (os exemplos são Kotlin e Scala); em Java, era uma questão de permanecer compatível com versões anteriores da versão Java mais antiga que não tinha nenhum marcador de substituição.


Parece inconsistente que a substituição seja uma anotação, quando houve alterações que introduziram novas palavras-chave. Por exemplo, o modificador "padrão" para métodos de interface.
JWA

6
@ jwa Na verdade: defaultjá era uma palavra-chave reservada (usada nas instruções do switch) - eles adicionaram um novo uso a ela. Existem também algumas palavras-chave que não fazem nada no momento, mas são reservadas para uso futuro (const, goto) - consulte JLS §3.9
Michał Kosmulski

3
"exemplos são Kotlin e Java" parece um erro de digitação aqui, você quis escrever, por exemplo, Scala em vez de Java?
mosquito

6
embora seja verdade que a adição de palavras-chave globais interrompa coisas, ela poderia ter sido adicionada como uma palavra-chave contextual sem quebrar o código. supõe-se que isso não foi feito, pois dificultaria a análise e o mecanismo de anotação era suficientemente bom
jk.

1
@ MichałKosmulski: Lembro que a enumpalavra - chave adicionada quebraria o código mais antigo.
Palavras-

13

Você não precisa da anotação @Override para substituir o comportamento; É uma anotação porque simplesmente adiciona algum contexto da intenção do método ao compilador, não alterando o próprio método.

Sem a anotação, você pode pretende a funcionalidade de substituição, mas acidentalmente deixar de fazê-lo (usando uma assinatura ligeiramente diferente). A adição da anotação informa ao compilador para gerar um erro se esse método não estiver substituindo o comportamento.

Como tal, faz todo o sentido como uma anotação.


+1 Faz sentido que, semelhante à desativação de avisos por meio de anotações, também seja possível ativar avisos / erros opcionais por meio de anotações.
Hulk #
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.