Почему java использует аннотацию @Override вместо модификатора?

19

Что побудило java использовать @Overrideаннотацию вместо создания нового overrideмодификатора?

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

против

public override String toString() {
   return "";
}
JWA
источник
2
Это была запоздалая мысль.
Тулаинс Кордова

Ответы:

21

@ Override изначально не было в языке. Когда возникла необходимость добавить его, было проще использовать общий механизм (аннотации), чем добавить новое ключевое слово в язык. Добавление нового ключевого слова всегда является несовместимым изменением, поскольку оно может нарушить работу программ, которые используют эти слова в качестве идентификатора.

В языках, которые добавляют маркер переопределения прямо с первого дня, это довольно часто ключевое слово (например, Kotlin и Scala), в Java это было вопросом обратной совместимости со старой версией Java, которая не имела маркера переопределения.

Михал Космульский
источник
Кажется непоследовательным, что переопределение является аннотацией, когда произошли изменения, в результате которых были введены новые ключевые слова. Например, модификатор «default» для методов интерфейса.
JWA
6
@jwa Не совсем: defaultуже было зарезервированным ключевым словом (используемым в выражениях switch) - они просто добавили новое использование для него. Есть также несколько ключевых слов, которые ничего не делают прямо сейчас, но зарезервированы для будущего использования (const, goto) - см. JLS § 3.9
Михал Космульский
3
«Примеры Kotlin и Java» выглядит здесь как опечатка. Вы хотели написать, например, Scala вместо Java?
комнат
6
Хотя верно, что добавление глобальных ключевых слов нарушает работу, оно могло быть добавлено как контекстное ключевое слово без нарушения кода. Можно предположить, что это не было сделано, поскольку это немного усложнило бы синтаксический анализ, и механизм аннотации был достаточно хорош
jk.
1
@ MichałKosmulski: Я помню, enumчто добавленное ключевое слово сломало бы старый код. Другие ключевые слова здесь: stackoverflow.com/questions/16506411
Аллон Гуралнек
13

Вам не нужна аннотация @Override, чтобы фактически переопределить поведение; Это аннотация, потому что она просто добавляет некоторый контекст намерения метода для компилятора, а не изменяет сам метод.

Без аннотаций, вы можете намереваться функциональности переопределения, но случайно не в состоянии сделать это (используя несколько иную подпись). Добавление аннотации говорит компилятору сгенерировать ошибку, если этот метод на самом деле не переопределяет поведение.

Таким образом, это имеет смысл в качестве аннотации.

Эрик Кинг
источник
+1 Имеет смысл, что подобно отключению предупреждений с помощью аннотаций, можно также включить необязательные предупреждения / ошибки с помощью аннотаций.
Халк