Зачем делать конструктор класса приватным?

«Зачем делать конструктор класса приватным?» — вопрос из категории ООП, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Приватный конструктор запрещает создание экземпляров класса с помощью оператора new извне самого класса. Это ключевой приём для реализации определённых шаблонов проектирования и ограничений.

Основные случаи применения:

  1. Утилитарные (Utility) классы: Классы, содержащие только статические методы. Создание их экземпляров бессмысленно.

    public final class MathUtils {
        private MathUtils() {
            throw new AssertionError("Utility class, cannot be instantiated");
        }
        public static int add(int a, int b) { return a + b; }
    }
  2. Singleton (Одиночка): Гарантирует существование только одного экземпляра класса.

    public class DatabaseConnection {
        private static final DatabaseConnection INSTANCE = new DatabaseConnection();
        private DatabaseConnection() { /* инициализация */ }
        public static DatabaseConnection getInstance() { return INSTANCE; }
    }
  3. Классы, инстанциируемые через фабричные методы: Когда логика создания объекта сложна или должна возвращать разные подтипы.

    public class ComplexObject {
        private ComplexObject() {}
        public static ComplexObject createFromConfig(Config c) {
            // сложная логика инициализации
            return new ComplexObject();
        }
    }
  4. Запрет наследования: Если все конструкторы приватны, класс не может быть унаследован (если только это не вложенный класс).