При переопределении не виртуального метода в Java рекомендуется использовать аннотацию @Override
, но что, если я реализую абстрактный метод? Должен ли я также использовать @Override
?
Должен ли я добавить аннотацию @Override при реализации абстрактных методов в Java?
Ответ 1
Я предпочитаю использовать @Override
в этом случае, так что метод будет помечен в подклассах, если суперкласс изменит (вообще удалив метод или изменив его подпись и т.д.).
Единственное реальное различие заключается в том, что без аннотации, если метод в суперклассе/интерфейсе изменяется или удаляется, рассматриваемая реализация просто становится "нормальным" методом этого класса. Таким образом, вы должны добавить аннотацию, если вы реализуете метод исключительно для выполнения контракта; и вы, вероятно, не должны добавлять его, если метод имеет смысл в вашем классе, независимо от каких-либо реализованных интерфейсов или унаследованных абстрактных методов.
Ответ 2
Да, опять-таки, он сообщает компилятору: "Я действительно хочу переопределить метод здесь. Если нет соответствующего метода для переопределения, я допустил ошибку и хочу, чтобы об этом говорили!"
Лично я считаю, что жаль, что это всего лишь аннотация, а не часть языка (как в С#), но, конечно же, преимущество задним числом.
Ответ 3
Да. Рекомендуется практиковать Джошуа Блох в "Эффективной Java".
Ответ 4
На самом деле, Джошуа Блох в заключительном параграфе на стр. 178 в "Эффективной Java" (2-е изд.) говорит, что это не важно для методов конкретных классов, которые переопределяют абстрактные методы для использования аннотации Override
, потому что компилятор даст ошибка в любом случае. Однако "это не вредно".
Я бы рекомендовал выбрать стратегию и придерживаться ее последовательно.