Это четвертый пункт из серии Эффективная 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-му посту из этой серии.

Чтобы узнать больше:

  1. Чтобы послушать подкаст: fragmentedpodcast.com
  2. Исходная книга: Эффективная Java 2-е издание