Что такое телескопический конструктор (Telescoping Constructor) в Java?

«Что такое телескопический конструктор (Telescoping Constructor) в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Телескопический конструктор (Telescoping Constructor) — это антипаттерн в Java, при котором класс содержит несколько перегруженных конструкторов. Каждый последующий конструктор принимает на один параметр больше, чем предыдущий, вызывая предыдущий конструктор с параметрами по умолчанию для остальных аргументов. Это создает «телескопическую» цепочку вызовов.

Проблемы этого подхода:

  1. Неудобство использования: При большом количестве параметров код становится громоздким и трудночитаемым.
  2. Негибкость: Невозможно опустить промежуточные параметры, не указав значения по умолчанию для всех последующих.
  3. Сложность поддержки: Добавление нового параметра требует создания нового конструктора, что ведет к комбинаторному взрыву.

Пример антипаттерна:

public class NutritionFacts {
    private int servingSize;  // required
    private int servings;     // required
    private int calories;     // optional
    private int fat;          // optional
    private int sodium;       // optional

    // Телескопическая цепочка конструкторов
    public NutritionFacts(int servingSize, int servings) {
        this(servingSize, servings, 0);
    }
    public NutritionFacts(int servingSize, int servings, int calories) {
        this(servingSize, servings, calories, 0);
    }
    public NutritionFacts(int servingSize, int servings, int calories, int fat) {
        this(servingSize, servings, calories, fat, 0);
    }
    public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium) {
        this.servingSize = servingSize;
        this.servings = servings;
        this.calories = calories;
        this.fat = fat;
        this.sodium = sodium;
    }
}
// Использование: нужно указать все параметры до нужного
NutritionFacts cocaCola = new NutritionFacts(240, 8, 100, 0, 35);

Решение: Вместо телескопических конструкторов следует использовать паттерн Builder (см. Effective Java, Джошуа Блох), который обеспечивает гибкость, читаемость и безопасность при создании объектов с множеством опциональных параметров.