Ответ
Телескопический конструктор (Telescoping Constructor) — это антипаттерн в Java, при котором класс содержит несколько перегруженных конструкторов. Каждый последующий конструктор принимает на один параметр больше, чем предыдущий, вызывая предыдущий конструктор с параметрами по умолчанию для остальных аргументов. Это создает «телескопическую» цепочку вызовов.
Проблемы этого подхода:
- Неудобство использования: При большом количестве параметров код становится громоздким и трудночитаемым.
- Негибкость: Невозможно опустить промежуточные параметры, не указав значения по умолчанию для всех последующих.
- Сложность поддержки: Добавление нового параметра требует создания нового конструктора, что ведет к комбинаторному взрыву.
Пример антипаттерна:
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, Джошуа Блох), который обеспечивает гибкость, читаемость и безопасность при создании объектов с множеством опциональных параметров.