Что может быть плохим примером наследования в Java? - PullRequest
5 голосов
/ 20 марта 2011

Я знаю преимущества наследования в Java, но мне несколько сложно признать, что у него тоже есть недостатки. Кто-нибудь может дать мне плохой пример наследования в Java?

Ответы [ 5 ]

7 голосов
/ 20 марта 2011
  • Stack extends Vector. Стек не является вектором.
  • Properties extends Hashtable. Таблица свойств не является хеш-таблицей.

См. этот ответ с цитатой из Эффективной Java.

Было легко написать реализацию Stack, используя то, что уже реализовано в Vector (аналогично для Properties), но это создало проблемы - см. Здесь

5 голосов
/ 20 марта 2011

Одним из примеров является старый шаблон реализации константных интерфейсов (интерфейс, содержащий только неизменяемые поля), тогда классы, желающие использовать эти константы, реализовали бы этот интерфейс для удобства. Проблема в том, что ваш класс теперь наследует API этого интерфейса, и расширения его дизайна могут в будущем нанести вред вашему API.

Использование постоянных интерфейсов таким образом обычно считается анти-паттерном в наши дни. Начиная с Java 5, вы можете использовать перечисления вместо интерфейсов, полных констант, и статический импорт вместо определения постоянных интерфейсов.

С Эффективная Java от Джоша Блоха:

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

4 голосов
/ 20 марта 2011

Есть довольно хорошая статья здесь , рассказывающая об использовании наследования и композиции в Java, в том числе примеры того, когда и зачем использовать одну над другой.Есть также интервью здесь , в котором обсуждался этот предмет (ссылаясь на указ Банды четырех"отдавать предпочтение композиции, а не наследованию").по крайней мере для меня, очень интересная тема на самом деле.Многие начинающие программисты получают некоторое наследство и начинают плохой путь проектирования, не всегда изучая, как работает полиморфизм и какие шаблоны и методы проектирования они могут использовать для написания более качественного программного обеспечения.Если вы объектно-ориентированный программист, вы никогда не узнаете слишком много о полиморфизме, интерфейсах, наследовании, композиции, абстракциях и т. Д.

1 голос
/ 20 марта 2011

Незрелость - это неспособность использовать свой интеллект без руководства другого. Иммануил Кант

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

Если вы хотите понять, попробуйте, например, прочитать книгу:

  • Эффективная Java (элемент 16): композиция "предпочтение" перед наследованием ( ссылка )
1 голос
/ 20 марта 2011

Я верю, что если оно следует принципу «есть» и человек, который его реализует, понимает его и не ставит в тупик, на самом деле нет никаких недостатков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...