Ответ
Телескопический конструктор (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, Джошуа Блох), который обеспечивает гибкость, читаемость и безопасность при создании объектов с множеством опциональных параметров.
Ответ 18+ 🔞
Да ты посмотри на эту дичь! Сидит какой-то джавист, чешет репу и думает: "А сделаю-ка я класс, где всё можно задать через конструкторы!". И начинает городить.
Получается этакая, блядь, матрёшка из пиздопроёбины. Каждый следующий конструктор — это как предыдущий, но с одним лишним параметром. И они все друг друга вызывают, эта цепочка, телескопическая, блядь, хуйня. Словно он не класс пишет, а подзорную трубу выёбывает, один хуй за другим накручивает.
И в чём же, сука, подвох?
-
Пользоваться — пиздец как неудобно. Захотел ты указать только
servingSize,servingsиsodium? А хуй там! Нельзя просто так взять и пропуститьcaloriesсfat. Придётся тебе, мой друг, вписать все промежуточные значения, даже если они тебе нахуй не сдались. Получается вот такая порнография:NutritionFacts cocaCola = new NutritionFacts(240, 8, 100, 0, 35);Видишь эти нули? Это не данные, это, блядь, памятник тупости разработчика. "Вот тут калории, которых нет, и жир, которого нет, а потом уже натрий, который есть". Ёперный театр!
-
Гибкости — ноль ебать. А если завтра понадобится шестой параметр? Правильно, пишешь новый конструктор с шестью аргументами, и вся твоя красивая телескопическая хуйня идёт лесом. Поддержка превращается в ад.
-
Читаемость — хуй с горы. Глядя на вызов, нихуя не понятно, что означают эти цифры. Это ж не
calories=100, это просто четвёртый параметр в списке, блядь. Запутаться — раз плюнуть.
И что же делать, спросишь ты? А делать надо по-человечески, ёпта! Забей на эти телескопические выкрутасы. Есть же паттерн Builder, который Джошуа Блох, царство ему небесное, в своей библии "Effective Java" прописал.
С ним твой код превратится из этого убожества во что-то читаемое и гибкое:
NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8) // обязательные штуки
.calories(100)
.sodium(35)
.build();
Видишь? Никаких лишних нулей, всё по именам, ясно как божий день. Хочешь — укажи fat, хочешь — нет. Красота, а не код!
Так что запомни: телескопический конструктор — это путь в никуда, мартышлюшка для ленивых. Бери билдер и живи спокойно.