Dlaczego java używa adnotacji @Override zamiast modyfikatora?

19

Jakie były motywacje, aby java użyła @Overrideadnotacji zamiast tworzyć nowy overridemodyfikator?

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

vs.

public override String toString() {
   return "";
}
jwa
źródło
2
To była refleksja.
Tulains Córdova,

Odpowiedzi:

21

@Override początkowo nie było w języku. Kiedy trzeba było go dodać, łatwiej było zastosować ogólny mechanizm (adnotacje) niż dodać nowe słowo kluczowe do języka. Dodanie nowego słowa kluczowego jest zawsze niezgodną zmianą, ponieważ może uszkodzić programy, które używają tych słów jako identyfikatora.

W językach, które dodają znacznik przesłonięcia od samego początku, jest to często słowo kluczowe (przykłady to Kotlin i Scala), w Javie kwestia pozostania kompatybilna wstecz ze starszą wersją Java, która nie miała żadnego znacznika przesłonięcia.

Michał Kosmulski
źródło
Wydaje się niespójne, że zastąpienie jest adnotacją, gdy nastąpiły zmiany, które wprowadziły nowe słowa kluczowe. Na przykład „domyślny” modyfikator metod interfejsu.
jwa
6
@jwa Niezupełnie: defaultbyło już zarezerwowanym słowem kluczowym (używanym w instrukcjach switch) - właśnie dodali dla niego nowe zastosowanie. Istnieje również kilka słów kluczowych, które w tej chwili nic nie robią, ale są zastrzeżone do wykorzystania w przyszłości (const, goto) - patrz JLS §3.9
Michał Kosmulski
3
„przykładami są Kotlin i Java” tutaj wygląda literówka, czy chciałeś napisać np. Scala zamiast Java?
komar
6
prawdą jest, że dodanie globalnych słów kluczowych psuje rzeczy, ale mogło zostać dodane jako kontekstowe słowo kluczowe bez zepsucia kodu. zakłada się, że nie zostało to zrobione, ponieważ nie skomplikowałoby to parsowania, a mechanizm adnotacji był wystarczająco dobry
jk.
1
@ MichałKosmulski: Pamiętam, enumże dodane słowo kluczowe złamałoby starszy kod. Więcej kluczowych słów kluczowych tutaj: stackoverflow.com/questions/16506411
Allon Guralnek
13

Nie potrzebujesz adnotacji @Override, aby faktycznie zastąpić zachowanie; Jest to adnotacja, ponieważ po prostu dodaje kontekst kontekstu metody dla kompilatora, nie zmieniając samej metody.

Bez adnotacji możesz chcieć zastąpić funkcjonalność, ale przypadkowo tego nie zrobisz (używając nieco innej sygnatury). Dodanie adnotacji nakazuje kompilatorowi wygenerowanie błędu, jeśli ta metoda w rzeczywistości nie zastępuje zachowania.

Jako taki ma sens jako adnotacja.

Eric King
źródło
+1 Ma sens, że podobnie jak wyłączenie ostrzeżeń za pomocą adnotacji, możliwe byłoby również włączenie opcjonalnych ostrzeżeń / błędów za pomocą adnotacji.
Hulk,