2007 yılında, Joshua Blochs'un "oluşturucu kalıbını" ele geçirmesi ve özellikle bir nesnenin çoğu isteğe bağlı olan çok sayıda özelliğe sahip olması durumunda, yapıcıların ve ayarlayıcıların aşırı kullanımını geliştirmek için nasıl değiştirilebileceği hakkında bir makale okudum. Bu tasarım modelinin kısa bir özeti burada belirtilmiştir .
Bu fikri beğendim ve o zamandan beri kullanıyorum. Sorun, müşteri bakış açısından kullanmak çok temiz ve güzel olsa da, onu uygulamak serseri bir acı olabilir! Nesnede tek bir özelliğin başvuruda bulunduğu ve böylece nesnenin oluşturulduğu ve yeni bir özelliğin eklenmesi çok zaman alan birçok farklı yer vardır.
Yani ... bir fikrim vardı. İlk olarak, Joshua Bloch'un tarzında örnek bir nesne:
Josh Bloch Tarzı:
public class OptionsJoshBlochStyle {
private final String option1;
private final int option2;
// ...other options here <<<<
public String getOption1() {
return option1;
}
public int getOption2() {
return option2;
}
public static class Builder {
private String option1;
private int option2;
// other options here <<<<<
public Builder option1(String option1) {
this.option1 = option1;
return this;
}
public Builder option2(int option2) {
this.option2 = option2;
return this;
}
public OptionsJoshBlochStyle build() {
return new OptionsJoshBlochStyle(this);
}
}
private OptionsJoshBlochStyle(Builder builder) {
this.option1 = builder.option1;
this.option2 = builder.option2;
// other options here <<<<<<
}
public static void main(String[] args) {
OptionsJoshBlochStyle optionsVariation1 = new OptionsJoshBlochStyle.Builder().option1("firefox").option2(1).build();
OptionsJoshBlochStyle optionsVariation2 = new OptionsJoshBlochStyle.Builder().option1("chrome").option2(2).build();
}
}
Şimdi "geliştirilmiş" versiyonum:
public class Options {
// note that these are not final
private String option1;
private int option2;
// ...other options here
public String getOption1() {
return option1;
}
public int getOption2() {
return option2;
}
public static class Builder {
private final Options options = new Options();
public Builder option1(String option1) {
this.options.option1 = option1;
return this;
}
public Builder option2(int option2) {
this.options.option2 = option2;
return this;
}
public Options build() {
return options;
}
}
private Options() {
}
public static void main(String[] args) {
Options optionsVariation1 = new Options.Builder().option1("firefox").option2(1).build();
Options optionsVariation2 = new Options.Builder().option1("chrome").option2(2).build();
}
}
"Geliştirilmiş sürümümde" görebileceğiniz gibi, herhangi bir ekleme özelliği (veya bu durumda seçenekler) hakkında kod eklememiz gereken 2 daha az yer var! Görebildiğim tek olumsuz, dış sınıfın örnek değişkenlerinin kesin olamayacağı. Ancak, sınıf bu olmadan hala değişmez.
Sürdürülebilirlikteki bu iyileşmenin gerçekten dezavantajı var mı? Görmediğim iç içe sınıf içindeki özellikleri tekrarlamasının bir nedeni olmalı?