2009-06-17 10 views

Odpowiedz

53

W tym przypadku preferuję użycie @Override, aby metoda została oznaczona w podklasach, jeśli nadklasa się zmieni (całkowite usunięcie metody lub zmiana jej sygnatury itp.).

Jedyną różnicą jest to, że bez adnotacji, jeśli metoda w superklasie/interfejsie zostanie zmieniona lub usunięta, rozpatrywana implementacja staje się po prostu "normalną" metodą tej klasy. W związku z tym powinieneś dodać adnotację, jeśli wdrażasz metodę wyłącznie w celu wypełnienia umowy; i prawdopodobnie nie powinieneś go dodawać, jeśli metoda ma sens w twojej klasie, niezależnie od implementowanych interfejsów lub dziedziczonych metod abstrakcyjnych.

+4

Potrzebujesz również Java 6, aby wykorzystać tę adnotację. Java 5 nie pozwala umieścić go w implementacjach interfejsu. – akarnokd

13

Tak. Zalecana praktyka Joshua Blocha w Effective Java.

19

Tak - ponownie, mówi kompilatorowi: "Naprawdę chcę zastąpić metodę tutaj.Jeśli tam nie jest odpowiednią metodą do nadpisania, popełniłem błąd i chcę być o tym poinformowany ! "

Osobiście uważam, że szkoda, że ​​jest to tylko adnotacja, a nie część języka (jak to jest w języku C#), ale oczywiście jest to korzyść po fakcie.

+0

+1 dla "testu regresji" – guerda

+1

To uratowało moją skórę kilka razy. –

6

Właściwie Joshua Bloch, w ostatnim akapicie stronie 178 w Effective Java (2nd ed.), mówi, że nie jest istotne dla metod konkretnych klas, które zastępują metody abstrakcyjne używać Override adnotacji ponieważ kompilator mimo to daj błąd. Jednak "nie jest to szkodliwe".

Zalecam wybór strategii i konsekwentne jej przestrzeganie.

+0

Kompilator i tak dałby błąd? Masz na myśli, że jeśli konkretna klasa implementuje metodę, która nie jest abstrakcyjną metodą superklasy, kompilator narzekałby na nią? To nie może być to, co masz na myśli, ale nie mogę zrozumieć, co masz na myśli. – LarsH

+1

@LarsH On oznacza, że ​​kompilator da błąd, jeśli konkretna klasa nie implementuje abstrakcyjnej metody w superklasie, co miałoby miejsce, gdybyś pomylił nazwę abstrakcyjnej metody, którą podklasa musi zaimplementować. –

+1

@espertus: Dzięki za wyjaśnienia. Nie dostaniesz więc błędu ani ostrzeżenia, jeśli, jak powiedział Andrzej, metoda w superklasie/interfejsie zostanie zmieniona lub usunięta. – LarsH

Powiązane problemy