Всем известно и очевидно, что иммутабельность объектов - это суть хорошо, как в многопоточных средах так и просто позволяет не копировать лишний раз объект при передаче его.
Но вот в Java нету средств инициализации таких объектов. Т.е. допустим, есть
class Nut {
final Protein protein;
final Fat fat;
final Carbohydrate carbohydrate;
}
//через конструктор
class Nut {
final Protein protein;
final Fat fat;
final Carbohydrate carbohydrate;
Nut(Protein protein, Fat fat, Carbohydrate carbohydrate) {
this.protein = protein;
this.fat = fat;
this.carbohydrate = carbohydrate;
}
}
//паттерном строитель
class Nut {
public class Builder {
Protein protein;
Fat fat;
Carbohydrate carbohydrate;
Builder protein(Protein protein) {
this.protein = protein;
return this;
}
Builder fat(Fat fat) {
this.fat = fat;
return this;
}
Builder carbohydrate(Carbohydrate carbohydrate){
this.carbohydrate = carbohydrate;
return this;
}
Nut build() {
return new Nut(protein, fat, carbohydrate);
}
}
final Protein protein;
final Fat fat;
final Carbohydrate carbohydrate;
Nut(Protein protein, Fat fat, Carbohydrate carbohydrate) {
this.protein = protein;
this.fat = fat;
this.carbohydrate = carbohydrate;
}
}
А второй способ стольже убог сколь и популярен, так как требует в два раза больше кодинга при полном отсутствии полезности кода (ну обход косяков языка полезностью не считается), единственное преимущество возникнет только если вам платят за строчки кода.
Итак, чтоже остается правильному программисту, подскажите? Можно например делать не final поля, помечать их аннотациями и инициализировать через reflection, однако, при минимуме дублирующегося кода, и всех неоспоримых преимуществах, это требует отсутствия final, что очень плохо.