Java: Должен ли я добавить аннотацию @Override при реализации абстрактных методов? - PullRequest
48 голосов
/ 17 июня 2009

При переопределении не виртуального метода в Java рекомендуется использовать аннотацию @Override, но что, если я реализую абстрактный метод? Должен ли я также использовать @Override?

Ответы [ 4 ]

66 голосов
/ 17 июня 2009

Я предпочитаю использовать @Override в этом случае, так что метод помечается в подклассах, если изменяется суперкласс (либо удаление метода полностью, либо изменение его сигнатуры и т. Д.).

Единственная реальная разница состоит в том, что без аннотации, если метод в суперклассе / интерфейсе изменяется или удаляется, рассматриваемая реализация просто становится "нормальным" методом этого класса. Таким образом, вы должны добавить аннотацию, если вы реализуете метод исключительно для выполнения контракта; и вам, вероятно, не следует добавлять его, если метод имеет смысл в вашем классе, независимо от каких-либо реализованных интерфейсов или унаследованных абстрактных методов.

20 голосов
/ 17 июня 2009

Да, опять же, он говорит компилятору: «Я действительно хочу переопределить метод здесь. Если там не соответствующий метод для переопределения, я сделал ошибку и хочу быть об этом рассказал! "

Лично я думаю, что жаль, что это просто аннотация, а не часть языка (как это происходит в C #), но это, конечно, преимущество задним числом.

13 голосов
/ 17 июня 2009

Да. Рекомендуется практикой Джошуа Блоха по эффективной Java.

6 голосов
/ 05 января 2010

На самом деле, Джошуа Блох, в последнем абзаце страницы 178 в Effective Java (2nd Ed.) , говорит, что для методов конкретных классов, которые переопределяют абстрактные методы, не обязательно использовать Override аннотации, потому что компилятор выдаст ошибку в любом случае. Однако "это не вредно".

Я бы порекомендовал выбрать стратегию и придерживаться ее последовательно.

...