Должны ли мы @Override реализации метода интерфейса? - PullRequest
403 голосов
/ 17 октября 2008

Следует ли аннотировать метод, реализующий метод интерфейса, @Override?

Javadoc аннотации Override говорит:

Указывает, что объявление метода предназначено для переопределения объявления метода в суперклассе. Если метод аннотирован этим типом аннотации, но не переопределяет метод суперкласса, компиляторы должны генерировать сообщение об ошибке.

Я не думаю, что интерфейс технически является суперклассом. Или это?

Разработка вопроса

Ответы [ 15 ]

284 голосов
/ 17 октября 2008

Вы должны использовать @Override всякий раз, когда это возможно. Это предотвращает совершение простых ошибок. Пример:

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

Не компилируется, потому что не корректно переопределяет public boolean equals(Object obj).

То же самое касается методов, которые реализуют интерфейс ( 1.6 и выше только ) или переопределяют метод класса Super.

100 голосов
/ 17 октября 2008

Я считаю, что поведение javac изменилось - с 1.5 запрещено аннотирование, с 1.6 - нет. В аннотации предусмотрена дополнительная проверка во время компиляции, поэтому, если вы используете 1.6, я бы пошел на это.

58 голосов
/ 25 ноября 2011

Вы должны всегда аннотировать методы с помощью @Override, если он доступен.

В JDK 5 это означает переопределение методов суперклассов, в JDK 6 и 7 это означает переопределение методов суперклассов и реализацию методов интерфейсов. Причина, как упоминалось ранее, заключается в том, что он позволяет компилятору перехватывать ошибки, когда вы думаете, что переопределяете (или реализуете) метод, но на самом деле определяете новый метод (другую сигнатуру).

Пример equals(Object) против equals(YourObject) является стандартным примером, но тот же аргумент может быть приведен для реализаций интерфейса.

Я полагаю, что причина, по которой нет необходимости комментировать методы реализации интерфейсов, заключается в том, что JDK 5 пометил это как ошибку компиляции. Если JDK 6 сделает эту аннотацию обязательной, это нарушит обратную совместимость.

Я не пользователь Eclipse, но в других IDE (IntelliJ) аннотация @Override добавляется только при реализации методов интерфейса, если проект задан как проект JDK 6+. Я предположил бы, что Затмение похоже.

Однако я бы предпочел увидеть другую аннотацию для этого использования, возможно, аннотацию @Implements.

15 голосов
/ 17 октября 2008

Я бы использовал его при каждой возможности. См. Когда вы используете аннотацию @Override в Java и почему?

11 голосов
/ 08 июня 2009

JDK 5.0 не позволяет использовать аннотацию @Override, если вы реализуете метод, объявленный в интерфейсе (ошибка компиляции), но JDK 6.0 позволяет это. Так что, может быть, вы можете настроить предпочтения вашего проекта в соответствии с вашими требованиями.

3 голосов
/ 19 декабря 2015

Если класс concrete не переопределяет абстрактный метод, использование @Override для реализации является открытым вопросом, так как компилятор неизменно предупредит вас о любые неосуществленные методы. В этих случаях может быть выдвинут аргумент, что это снижает читабельность - в вашем коде читается больше вещей, и, в меньшей степени, он называется @Override, а не @Implement.

3 голосов
/ 03 декабря 2010

Это не проблема с JDK. В Eclipse Helios он допускает аннотацию @Override для реализованных методов интерфейса, в зависимости от того, какой JDK 5 или 6. Как и в Eclipse Galileo, аннотация @Override не допускается, в зависимости от того, JDK 5 или 6.

3 голосов
/ 18 октября 2008

Переопределение ваших собственных методов, унаследованных от ваших собственных классов, обычно не нарушает рефакторинг с использованием ide. Но если вы переопределите метод, унаследованный от библиотеки, рекомендуется использовать его. Если вы этого не сделаете, то при более поздней смене библиотеки вы получите не ошибку, а скрытую ошибку.

2 голосов
/ 29 января 2009

Для меня часто это единственная причина, по которой какой-то код требует Java 6 для компиляции. Не уверен, что оно того стоит.

1 голос
/ 09 марта 2018

Читая javadoc в java8, вы можете найти следующее в объявлении переопределения интерфейса:

Если метод аннотирован этим аннотационным типом, компиляторы должны генерировать сообщение об ошибке, если не выполняется хотя бы одно из следующих условий:

  • Метод переопределяет или реализует метод, объявленный в супертипе.
  • Метод имеет сигнатуру, эквивалентную переопределению сигнатуры любого открытого метода, объявленного в {@linkplain Object}.

Итак, по крайней мере, в java8 вы должны использовать @Override для реализации метода интерфейса.

...