Effective Java: Создание и уничтожение объектов

Дочитал книгу Effective Java 2nd ed. и решил выделить основные идеи каждого из её параграфов. Прочтение этого никак не может заменить прочтения самой книги, но может послужить, например, для повторения материала.
Итак, первая после введения глава, Создание и уничтожение объектов (Creating and Destroying Objects).


Item 1. Как насчёт использования статических фабричных методов (static factory methods) вместо конструкторов?

Фабричные методы имеют следующие преимущества перед конструкторами:
  • Им можно подбирать "говорящие" названия. Сравните: new BigInteger(int, int, Random) и BigInteger.probablePrime(int, Random) (этот конструктор и фабричный метод делают, по сути, одно и то же).
  • Фабричный метод не обязательно должен создавать новый объект, а может, например, получать его из кэша. Например, Integer.valueOf(int).
  • Фабричный метод может вернуть экземлпяр подкласса возвращаемого типа. Например, EnumSet.of(...).
  • Использование фабричных методов позволяет избежать повторения параметров при создании объектов параметризированных типов:
    Map<String, List<String>> m = HashMap.newInstance();
    (на самом деле такого фабричного метода нет в HashMap)
    против
    Map<String, List<String>> m = new HashMap<String, List<String>>();.
Конечно, есть и обратная сторона медали:
  • Если класс не предоставляет ни одного public или protected конструктора, то от него нельзя будет отнаследоваться.
  • В javadoc-документации фабричные методы не отличимы от других статических методов, в отличие от конструкторов, которые выделены в отдельную таблицу.

Item 2. Примите во внимание использование шаблона Builder вместо конструктора с большим числом параметров.

Если класс предоставляет конструкторы с большим числом параметров, в том числе телескопические (telescoping constructor), клиентский код этого класса будет трудно писать и ещё труднее читать. Паттерн JavaBeans (с конструктором без параметров, но с гетерами и сетерами) "многословен", лишает возможности создания неизменяемых объектов (immutable objects) и оставляет возможность использования не инициализированных до конца объектов. Шаблон Builder лишён вышеперечисленных недостатков, хотя имеет и парочку своих.

Item 3. При создании классов-одиночек (singleton) используйте приватные конструкторы и перечисления (enum).

Название говорит само за себя. Приватный конструктор можно вызвать, используя reflection, и он не подходит для сериализуемых синглтонов (об этом в последней главе книги), поэтому самый надёжный способ организовать синглтон в Java - использовать для этого Enum с единственным элементом.

Item 4. Запрещайте создание экземпляров класса с помощью приватного конструктора.

Бесполезно делать инструментарные классы (которые содержат только статические методы) абстрактными - от них можно будет отнаследоваться (а делать класс abstract и final одновременно запрещено). Лучше для таких классов писать приватный конструктор.

Item 5. Избегайте создания лишних объектов.

Основные идеи: неизменяемые объекты (immutable objects) можно использовать многократно, не создавая новые экземпляры; необходимо следить за автобоксингом (autoboxing), использовать, где возможно, примитивы.

Item 6. Избавляйтесь от устаревших объектов.

Утечки памяти случаются и в программах на Java. В параграфе приведён пример реализации стека, в котором не зануляются ссылки на выброшенные объекты. Так делать нельзя.

Item 7. Избегайте использование финализаторов.

Правильно писать методы-финализаторы сложно и чаще всего не нужно. Они опасны и непредсказуемы. Единственная здравая причина написать финализатор - необходимость предупреждать автора клиентского кода о том, что ваш объект не был завершён (terminated) должным образом.

Комментариев нет:

Отправить комментарий