Дочитал книгу Effective Java 2nd ed. и решил выделить основные идеи каждого из её параграфов. Прочтение этого никак не может заменить прочтения самой книги, но может послужить, например, для повторения материала.
Итак, первая после введения глава, Создание и уничтожение объектов (Creating and Destroying Objects).
Item 1. Как насчёт использования статических фабричных методов (static factory methods) вместо конструкторов?
Фабричные методы имеют следующие преимущества перед конструкторами:
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) должным образом.
Итак, первая после введения глава, Создание и уничтожение объектов (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) должным образом.
Комментариев нет:
Отправить комментарий