これはビルダー パターンの一種のように見えます (実際にはそうではありません)。
通常(あなたの例を使用し、それが不変であると仮定して)、次のようなパターンに従います。
public class MyObject {
private final String name;
private final int height;
private final int width;
private final String color;
private final int age;
private MyObject(Builder builder) { // Notice this is private
name = builder.name;
height = builder.height;
width = builder.width;
color = builder.color;
age = builder.age;
}
// Getters
public static class Builder {
// Initialize these to defaults if you have any
private String name;
private int height;
private int width;
private String color;
private int age;
// Getters as usual
// Every setter looks like this:
public Builder setName(String name) {
this.name = name;
return this;
}
// Other setters
public MyObject build() {
return new MyObject(this);
}
}
}
それを使用するには:
MyObject obj = new MyObject.Builder()
.setName("Foo")
.setHeight(5)
.setWidth(3)
.setColor("blue")
.setAge(7)
.build();
ビルダーを再利用することもできます。
MyObject.Builder builder = new MyObject.Builder();
MyObject obj1 = builder
.setName("Foo")
.setHeight(5)
.setWidth(3)
.setColor("blue")
.setAge(7)
.build();
MyObject obj2 = builder
.setName("Bar")
.build();
ここで、は以外のすべてobj2
と同じプロパティを持ちます。obj1
name
これは通常、長いコンストラクターの代わりになります。また、すべての情報がすぐに利用できず、オブジェクトを作成するために必要なすべての場所で自分で変数の束を宣言したくないオブジェクトにも使用できます。最後の例から、同じプロパティで初期化したいオブジェクトがたくさんある場合に、それらのプロパティを何度も渡すことなく使用できることがわかります。
その結果、不変オブジェクトが作成されますが、コンストラクターや静的ファクトリ メソッドの場合のように、すべての変数を同時に設定/渡す必要はありません。
ここにいくつかの参照があります:
- ウィキペディアのビルダー パターン ページ
- OODesign.com のビルダー パターン ページ(ビルダー パターンのインターフェイスを使用する方法も詳しく説明しています)
- Joshua Bloch の『Effective Java - 2nd Edition』は、Java のいくつかのパターン (およびアンチパターン)に関する優れた情報源です。