Czy metoda, która implementuje metodę interfejsu, powinna być opatrzona adnotacjami @Override
?
Javadoc z Override
dopiskiem mówi:
Wskazuje, że deklaracja metody ma zastąpić deklarację metody w nadklasie. Jeśli metoda jest opatrzona adnotacjami za pomocą tego typu adnotacji, ale nie zastępuje metody nadklasy, kompilatory są wymagane do wygenerowania komunikatu o błędzie.
Nie sądzę, aby interfejs był technicznie nadklasą. Albo to jest?
java
oop
interface
annotations
Benno Richters
źródło
źródło
Odpowiedzi:
W miarę możliwości należy używać @Override. Zapobiega popełnianiu prostych błędów. Przykład:
Nie kompiluje się, ponieważ nie zastępuje poprawnie
public boolean equals(Object obj)
.To samo dotyczy metod, które implementują interfejs (tylko 1.6 i wyżej ) lub zastępują metodę klasy Super.
źródło
Uważam, że zachowanie javaca zmieniło się - w wersji 1.5 zabraniał adnotacji, w wersji 1.6 tak nie jest. Adnotacja zapewnia dodatkową kontrolę czasu kompilacji, więc jeśli używasz wersji 1.6, wybrałbym to.
źródło
Zawsze powinieneś adnotować metody,
@Override
jeśli są dostępne.W JDK 5 oznacza to nadpisywanie metod nadklas, w JDK 6, a 7 oznacza nadpisywanie metod nadklas i wdrażanie metod interfejsów. Powodem, jak wspomniano wcześniej, jest to, że pozwala on kompilatorowi wychwytywać błędy, gdy uważasz, że przesłonisz (lub implementujesz) metodę, ale w rzeczywistości definiujesz nową metodę (inną sygnaturę).
equals(Object)
Porównaniu zequals(YourObject)
przykładem jest standardowym przykładem, ale to samo można powołać się na implementacji interfejsu.Wyobrażam sobie, że adnotacja metod implementacji interfejsów nie jest obowiązkowa, ponieważ JDK 5 oznaczył to jako błąd kompilacji. Jeśli JDK 6 uczyni tę adnotację obowiązkową, złamałoby to kompatybilność wsteczną.
Nie jestem użytkownikiem Eclipse, ale w innych IDE (IntelliJ)
@Override
adnotacja jest dodawana tylko podczas implementacji metod interfejsu, jeśli projekt jest ustawiony jako projekt JDK 6+. Wyobrażam sobie, że Eclipse jest podobny.Wolałbym jednak zobaczyć inną adnotację dla tego zastosowania, być może
@Implements
adnotację.źródło
Korzystałbym z niego przy każdej okazji. Zobacz Kiedy używasz adnotacji @Override w Javie i dlaczego?
źródło
JDK 5.0 nie pozwala na stosowanie
@Override
adnotacji, jeśli implementujesz metodę zadeklarowaną w interfejsie (błąd kompilacji), ale JDK 6.0 na to pozwala. Być może możesz skonfigurować preferencje projektu zgodnie ze swoimi wymaganiami.źródło
Jeśli konkretna klasa nie zastępuje metody abstrakcyjnej, użycie
@Override
do implementacji jest sprawą otwartą, ponieważ kompilator niezmiennie ostrzega przed wszelkimi niewdrożonymi metodami. W takich przypadkach można argumentować, że szkodzi to czytelności - to więcej rzeczy do przeczytania w kodzie i, w mniejszym stopniu, jest on wywoływany,@Override
a nie@Implement
.źródło
Przesłonięcie własnych metod odziedziczonych po twoich klasach zwykle nie spowoduje przerwania refaktoryzacji przy użyciu ide. Ale jeśli zastąpisz metodę odziedziczoną z biblioteki, zaleca się jej użycie. Jeśli tego nie zrobisz, często nie pojawi się błąd przy późniejszej zmianie biblioteki, ale dobrze ukryty błąd.
źródło
To nie jest problem z JDK. W Eclipse Helios umożliwia adnotację @Override dla zaimplementowanych metod interfejsu, w zależności od JDK 5 lub 6. Podobnie jak w przypadku Eclipse Galileo, adnotacja @Override jest niedozwolona, w zależności od JDK 5 lub 6.
źródło
Dla mnie często jest to jedyny powód, dla którego kod wymaga Java 6 do kompilacji. Nie jestem pewien, czy warto.
źródło
Czytając javadoc w java8, możesz znaleźć następujące informacje w deklaracji zastąpienia interfejsu:
Jeśli metoda jest opatrzona adnotacją za pomocą tego typu kompilatorów, wymagane jest wygenerowanie komunikatu o błędzie, chyba że spełniony jest przynajmniej jeden z następujących warunków:
Tak więc, przynajmniej w java8, powinieneś użyć @Override na implementacji metody interfejsu.
źródło
Sam Eclipse doda
@Override
adnotację, gdy powiesz jej, aby „generowała metody niezaimplementowane” podczas tworzenia klasy implementującej interfejs.źródło
Problem z włączeniem
@Override
polega na tym, że sprawia, że myślisz, że zapomniałeś wywołaćsuper.theOverridenMethod()
metodę, co jest bardzo mylące . To powinno być krystalicznie czyste. Być może Java powinna oferować@Interface
do użycia tutaj. No cóż, kolejna na wpół osamotniona osobliwość Java ...źródło
W java 6 i nowszych wersjach można użyć
@Override
metody implementującej interfejs.Ale nie sądzę, żeby miało to sens: przesłonięcie oznacza, że masz metodę w superklasie i implementujesz ją w podklasie.
Jeśli wdrażasz interfejs, myślę, że powinniśmy użyć
@Implement
lub coś innego, ale nie@Override
.źródło
W przypadku interfejsu użycie @Override spowodowało błąd kompilacji. Musiałem to usunąć.
Komunikat o błędzie poszedł „
The method getAllProducts() of type InMemoryProductRepository must override a superclass method
”.Przeczytał także „
One quick fix available: Remove @Override annotation.
”To było na Eclipse 4.6.3, JDK 1.8.0_144.
źródło
Jeśli klasa implementująca
interface
jestabstract
klasą,@Override
warto upewnić się, że implementacja dotyczyinterface
metody; bez klasa będzie tylko skompilować grzywny, nawet jeśli podpis metoda realizacja nie pasuje metody zadeklarowane w ; niedopasowana metoda pozostanie niewdrożona. Dokument Java cytowany przez @Zhao@Override
abstract
interface
interface
wyraźnie odnosi się do
abstract
superklasy;interface
nie można nazwać supertypem. Jest więc@Override
zbędny i nie ma sensu w przypadkuinterface
implementacji metod w konkretnych klasach.źródło