Это четвертый пункт из серии Эффективная Java. Всего 78 заданий (Надеюсь изучать по одному заданию каждый день). Это 4-й пост из серии, приятного чтения. Перейти в 3-й пост.
Создание и уничтожение объектов
Пункт 4
Обеспечьте отсутствие возможности создания экземпляров с помощью частного конструктора
Все мы сталкивались с ситуацией, когда дублирование кода начинается в классе. Постепенно это повторяется для различных связанных методов, и в итоге мы создаем служебный класс . Этот класс будет набором статических методов, которые мы можем вызывать напрямую, вызывая имя метода.
Например, для TextUtils, DateUtils, java.lang.Math, java.util.Arrays и т. д.
- Эти служебные классы не предназначены для создания экземпляров: экземпляр был бы бессмысленным.
- По умолчанию в Java, если явный конструктор отсутствует, компилятор предоставляет общедоступный конструктор по умолчанию без параметров.
Что произойдет, если мы не будем обеспечивать запрет на создание экземпляров?
- Мы можем попытаться добиться неинстанциональности, сделав класс абстрактным.
- Но поскольку он может быть подклассом, а подкласс может быть легко создан, он не может быть реализован.
- Кроме того, помечая его как абстрактный, пользователь может подумать, что он был разработан для наследования.
Как обеспечить запрет на создание экземпляров?
- Мы можем исключить создание экземпляра конструктора по умолчанию, явно определив конструктор.
- Этот явный конструктор будет частным конструктором.
- Объявляя его закрытым, мы обеспечиваем невозможность создания экземпляров, поскольку теперь он становится недоступным вне класса.
- Кроме того, частный конструктор не может быть вызван из подкласса, что предотвращает его создание подкласса.
// Noninstantiable utility class public class UtilityClass { // Suppress default constructor for noninstantiability private UtilityClass() { throw new AssertionError(); } }
- Нам необходимо предоставить AssertionError, если он вызывается либо из нежелательного места внутри класса, либо если есть отражение, пытающееся вызвать частный конструктор.
Перейти к 5-му посту из этой серии.
Чтобы узнать больше:
- Чтобы послушать подкаст: fragmentedpodcast.com
- Исходная книга: Эффективная Java 2-е издание