2008-10-17 14 views
352

Czy metodę implementującą metodę interfejsu należy opatrzyć przypisami z numerem @Override?Czy powinniśmy @Override implementacji metody interfejsu?

The javadoc of the Override annotation mówi:

Wskazuje, że deklaracja metoda ma zastąpić deklarację sposobu w nadrzędnej. Jeśli metoda jest opisana za pomocą tego typu adnotacji, ale nie zastępuje metody nadklasy, kompilatory muszą wygenerować komunikat o błędzie.

Nie sądzę, że interfejs jest technicznie superklasą. Albo to jest?

Question Elaboration

+5

Wow to pytanie może być krótsze, ale jest to pytanie, którego potrzebowałem. Dzięki –

+1

Nie mogę znaleźć zamiennika dla artykułu @Override (Oracle przeniosło ostatnio stare blogi Sun). Czy wiesz, jak to znaleźć? –

+3

Powinniśmy mieć teraz adnotację @Implement (s) (2015). To wszystko wyjaśni! – Alex

Odpowiedz

248

Należy użyć @Override miarę możliwości. Zapobiega popełnianiu prostych błędów. Przykład:

class C { 
    @Override 
    public boolean equals(SomeClass obj){ 
     // code ... 
    } 
} 

nie skompilować, ponieważ nie właściwie zastąpić public boolean equals(Object obj).

To samo dotyczy metod implementujących interfejs (1.6 i wyżej tylko) lub zastępuje metodę klasy Super.

+138

Należy pamiętać, że ** nie można ** dodać adnotacji @Override do metody implementującej interfejs w Javie 5 - generuje błąd. Jest dozwolone w Javie 6. –

+14

Um, nie, nie ma. W rzeczywistości Eclipse automatycznie wstawia @Override podczas wypełniania metod implementujących interfejs. – jjnguy

+14

-1, dopóki odpowiedź nie zawiera wzmianki o innym zachowaniu z wersji Java 1.5 do 1.6 w odniesieniu do implementacji metody interfejsu. Tylko dlatego, że widziałem, że jest to mylący aspekt dla ludzi i naprawdę zasługuje na wzmiankę. – Grundlefleck

90

Uważam, że zachowanie javac się zmieniło - z 1.5 to zabronione adnotacji, z 1.6 to nie robi. Adnotacja zapewnia dodatkową kontrolę podczas kompilacji, więc jeśli używasz wersji 1.6, powinienem to zrobić.

+0

Co to jest dodatkowa kontrola? –

+15

@Michael Możesz zauważyć, że jakikolwiek interfejs został usunięty. –

+2

@Sangdol +1 Jest to jedyna konkretna i prawidłowa odpowiedź na oryginalne pytanie. –

3

Zastępowanie własnych metod odziedziczonych z własnych klas zazwyczaj nie przerywa refaktoryzacji za pomocą ide. Ale jeśli zastąpisz metodę dziedziczoną z biblioteki, zaleca się jej użycie. Jeśli nie, często nie dostaniesz błędu w późniejszej zmianie biblioteki, ale dobrze ukrytego błędu.

1

Sam Eclipse doda adnotację @Override, gdy powiesz jej, aby "generowała niezimplementowane metody" podczas tworzenia klasy implementującej interfejs.

2

Dla mnie, często jest to jedyny powód, dla którego jakiś kod wymaga kompilacji Java 6. Nie jestem pewien, czy to jest tego warte.

+14

Warto ... – Thilo

11

JDK 5.0 nie zezwala na stosowanie adnotacji @Override, jeśli implementujesz metodę zadeklarowaną w interfejsie (błąd kompilacji), ale JDK 6.0 na to pozwala. Możesz więc skonfigurować preferencje projektu zgodnie z wymaganiami.

3

To nie jest problem z JDK. W Eclipse Helios umożliwia adnotację @Override dla zaimplementowanych metod interfejsu, w zależności od pakietu JDK 5 lub 6. Podobnie jak w Eclipse Galileo, adnotacja @Override jest niedozwolona, ​​w zależności od tego, która wartość JDK 5 lub 6.

48

Powinieneś zawsze opisywać metody za pomocą @Override, jeśli jest dostępna.

W JDK 5 oznacza to nadrzędne metody nadklas, w JDK 6 i 7 oznacza nadrzędne metody nadklas i wdrażanie metod interfejsów. Powodem, jak wspomniano wcześniej, jest to, że pozwala kompilatorowi wychwycić błędy tam, gdzie uważasz, że nadpisujesz (lub wdrażasz) metodę, ale w rzeczywistości definiują nową metodę (inny podpis).

Przykład to przykładowy przypadek, ale ten sam argument można wprowadzić dla implementacji interfejsu.

Wyobrażam sobie, że nie jest konieczne umieszczanie adnotacji na temat metod implementacji interfejsów, ponieważ JDK 5 oznaczył to jako błąd kompilacji. Jeśli JDK 6 uczyni tę adnotację obowiązkową, złamie kompatybilność wsteczną.

Nie jestem użytkownikiem Eclipse, ale w innych IDE (IntelliJ) adnotacja @Override jest dodawana tylko podczas implementowania metod interfejsu, jeśli projekt jest ustawiony jako projekt JDK 6+. Wyobrażam sobie, że Eclipse jest podobny.

Jednak wolałbym zobaczyć inną adnotację dla tego użycia, być może adnotację @Implements.

+2

+1, ta odpowiedź jest jedyną, która wyjaśnia sytuację. – Pacerier

1

Problem z tym @Override jest to, że sprawia, że ​​myślisz, że zapomniałeś wywołać metodę super.theOverridenMethod(), co jest bardzo mylące. To powinno być krystalicznie czyste. Być może Java powinna zaoferować tutaj @Interface. No cóż, kolejny pół dupą osobliwość Java ...

+3

Wywołanie super, gdy nie jest implementacja interfejsu, nie jest czymś, co zawsze potrzebujesz lub chcesz zrobić. Czasami dodajesz funkcjonalność - możesz to nazwać. Innym razem zastępujesz funkcje, więc nie nazywasz tego. Autor interfejsu API powinien udokumentować, czy opiera się on na funkcjach wewnętrznych, czy też nie i utworzyć udokumentowaną umowę dotyczącą prawidłowego przedłużenia klasy. – lilbyrdie

1

Jeśli beton klasa nie jest nadrzędnym abstrakcyjny sposób, używając @Override dla realizacji to otwarta kwestia, ponieważ kompilator będzie niezmiennie ostrzec cię o dowolne niezaimplementowane metody. W takich przypadkach można argumentować, że obniża to czytelność - więcej informacji można przeczytać na swoim kodzie i, w mniejszym stopniu, nazywa się to @Override, a nie @Implement.

-1

W wersjach java 6 i nowszych można użyć metody @Override dla metody implementującej interfejs.

Ale uważam, że to nie ma sensu: przesłonięcie oznacza, że ​​masz metodę w super klasie i wdrażasz ją w podklasę.

Jeśli implementujesz interfejs, myślę, że powinniśmy użyć @Implement lub czegoś innego, ale nie @Override.

0

Czytając javadoc w java8 można znaleźć następujące w deklaracji interfejsu ręczne:

Jeśli metoda jest opatrzone tej adnotacji typu kompilatory są wymagane do wygenerowania komunikatu o błędzie, chyba że co najmniej jeden z następujące warunki:

  • Metoda zastępuje lub implementuje metodę zadeklarowaną w nadtypie.
  • Metoda ma sygnaturę, która jest nadpisywana - równoważna z każdą publiczną metodą zadeklarowaną w {@linkplain Object}.

Tak więc, przynajmniej w java8, powinieneś używać @Override przy implementacji metody interfejsu.

Powiązane problemy