По великой книге "Эффективная Ява" :
Пункт 4: принудительное использование неотъемлемой части с помощью частного конструктора
- Попытка принудительного применения неотъемлемости путем создания абстрактного класса не работает.
- Конструктор по умолчанию генерируется только в том случае, если класс не содержит явных конструкторов, поэтому класс можно сделать нереализуемым путем включения частного конструктора:
// Noninstantiable utility class
public class UtilityClass
{
// Suppress default constructor for noninstantiability
private UtilityClass() {
throw new AssertionError();
}
}
Поскольку явный конструктор является закрытым, он недоступен за пределами класса. Ошибка AssertionError не является строго обязательной, но она обеспечивает страховку на случай, если конструктор случайно вызван из класса. Это гарантирует, что класс никогда не будет создан ни при каких обстоятельствах. Эта идиома слегка нелогична, так как конструктор предоставляется явно, чтобы его нельзя было вызвать. Поэтому целесообразно добавить комментарий, как показано выше.
В качестве побочного эффекта, эта идиома также предотвращает подкласс класса. Все конструкторы должны вызывать конструктор суперкласса, явно или неявно, и у подкласса не будет доступного конструктора суперкласса для вызова.