Что такое телескопический конструктор (Telescoping Constructor) в 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, Джошуа Блох), который обеспечивает гибкость, читаемость и безопасность при создании объектов с множеством опциональных параметров.

Ответ 18+ 🔞

Да ты посмотри на эту дичь! Сидит какой-то джавист, чешет репу и думает: "А сделаю-ка я класс, где всё можно задать через конструкторы!". И начинает городить.

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

И в чём же, сука, подвох?

  1. Пользоваться — пиздец как неудобно. Захотел ты указать только servingSize, servings и sodium? А хуй там! Нельзя просто так взять и пропустить calories с fat. Придётся тебе, мой друг, вписать все промежуточные значения, даже если они тебе нахуй не сдались. Получается вот такая порнография:

    NutritionFacts cocaCola = new NutritionFacts(240, 8, 100, 0, 35);

    Видишь эти нули? Это не данные, это, блядь, памятник тупости разработчика. "Вот тут калории, которых нет, и жир, которого нет, а потом уже натрий, который есть". Ёперный театр!

  2. Гибкости — ноль ебать. А если завтра понадобится шестой параметр? Правильно, пишешь новый конструктор с шестью аргументами, и вся твоя красивая телескопическая хуйня идёт лесом. Поддержка превращается в ад.

  3. Читаемость — хуй с горы. Глядя на вызов, нихуя не понятно, что означают эти цифры. Это ж не calories=100, это просто четвёртый параметр в списке, блядь. Запутаться — раз плюнуть.

И что же делать, спросишь ты? А делать надо по-человечески, ёпта! Забей на эти телескопические выкрутасы. Есть же паттерн Builder, который Джошуа Блох, царство ему небесное, в своей библии "Effective Java" прописал.

С ним твой код превратится из этого убожества во что-то читаемое и гибкое:

NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8) // обязательные штуки
        .calories(100)
        .sodium(35)
        .build();

Видишь? Никаких лишних нулей, всё по именам, ясно как божий день. Хочешь — укажи fat, хочешь — нет. Красота, а не код!

Так что запомни: телескопический конструктор — это путь в никуда, мартышлюшка для ленивых. Бери билдер и живи спокойно.