Эффективный Java Item1 — статический фабричный метод для создания объекта

Я просматривал эффективный пункт 1 java, где обсуждается «Статический метод фабрики против конструкторов» для создания объекта. Одним из упомянутых недостатков является следующее:

«Основной недостаток предоставления только статических фабричных методов заключается в том, что классы без общедоступных или защищенных конструкторов не могут быть подклассами».

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


person Prashant Chauhan    schedule 13.12.2016    source источник


Ответы (2)


Почему я должен предпочесть статические фабричные методы для создания объектов, если я заранее не знаю, будет ли расширяться класс или нет?

Ответ на этот вопрос содержится в статье 17 Эффективного использования Java: Проектируйте и документируйте для наследования или запретите это. Разработка класса для наследования требует значительно больше работы, включая следующие.

  1. Точное документирование последствий переопределения любого метода.
  2. Предоставление крючковых методов.
  3. Тестирование подклассов (путем самостоятельной реализации этих классов).
  4. Ограничение конструкторов, чтобы избежать всех переопределяемых методов.
  5. Учитывая интерфейсы Cloneable и Serializable и их влияние на наследование.

Если вы проделали всю эту работу, вы не будете предоставлять только статические фабричные методы. Вы также предоставите по крайней мере один общедоступный или защищенный конструктор.

Эффективная Java подробно описывает каждый из этих пунктов, но последний совет таков:

Лучшее решение этой проблемы — запретить создание подклассов в классах, которые не предназначены и не задокументированы для безопасного создания подклассов.

person jaco0646    schedule 14.12.2016
comment
Спасибо за ответ и указание на 17 пункт книги! - person Prashant Chauhan; 15.12.2016

Цитата:

Основной недостаток предоставления только статических фабричных методов заключается в том, что классы без общедоступных или защищенных конструкторов не могут быть подклассами.

Не статические фабрики, а предоставление только статических фабричных методов, почувствуйте разницу.

Вы должны проектировать для расширения, а не для «ну, может быть, я сейчас не совсем уверен, но я оставлю его расширяемым на всякий случай».

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

person lexicore    schedule 13.12.2016
comment
Спасибо, что указали на ошибку в вопросе. Я исправил это сейчас. - person Prashant Chauhan; 13.12.2016
comment
Тем не менее, я понимаю разницу между фабричным и статическим фабричным методом. Я имел в виду статический фабричный метод, а не фабрики. - person Prashant Chauhan; 13.12.2016
comment
Как я уже писал, вам нужно предоставить не только статические фабричные методы для расширения. Не такое уж большое ограничение. - person lexicore; 13.12.2016