だから私はいくつかのEffective Javaを読んでいます!この本の中で最も刺激的なセクションの 1 つは、Bloch が "Builder" (単なる POJO ではなくクラス) について書いている Immutable Object/Builder セクションです。
注: ここではモデル オブジェクトについて話しています。たとえば、ArticleやCarなどです。
これは、以前にこれらのオブジェクトを書いた方法です。
public class Car {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
ご覧のとおり、この設計には多くの点で欠陥があり、可変性が必要であり、最初にコンストラクターを使用してオブジェクトを構築し、次に名前を設定する必要があります。
もちろん、name
フィールドを final にして、コンストラクターの引数として使用することもできますが、たとえば多数の SQL テーブルをラップする大きなオブジェクトがある場合は、次のような醜いコンストラクターが作成されます。
public Car(int horsepowers, String name, String brand, int yearManufactured,
User owner, List<User> previousOwners) {
//Set the values
}
これは、オブジェクトを作成するときに読み取れなくなります。これはたった 6 つのフィールドです!
したがって、ブロッホは次のことを提案しています(不変性を伴う)
public class Car {
public static class Builder {
private String name;
public Builder setName(String name) {
this.name = name;
return this;
}
public Car build() {
reeturn new Car(this);
}
}
private final String name;
private Car(Builder builder) {
name = builder.name;
}
public String getName() {
return name;
}
}
//Construction example
Car car = new Car.Builder().setName("Speedy").build();
これで不変性が得られます。また、プリミティブまたは不変ではないオブジェクトがある場合は、それらをBuilder
のセッターにコピーし、Car
のゲッターに再度コピーします。
しかし、それは非常に冗長で、クラスが十分に小さい場合はコンストラクター引数を使用してきました。クラスに可変フィールドが必要な場合、クラスに十分なプロパティ (> 4 何か) がある場合は、そのフィールドを可変にします。
もう 1 つの問題は、Android を使用していて、クラスにたとえばBitmap
.
このような質問をたくさん見てきましたが、この質問に対する適切な答えを見つけることができないようです。これらの設計に標準はありますか?また、その設計はどのようになっていますか? メリット/デメリットは?
前もって感謝します!
編集:
質問は:
不変である必要があり、A) 少数のフィールドと B) 多数のフィールドを持つオブジェクト モデルを構築する最良の方法は何ですか? Bitmap
上記の問題および同様の問題を処理するにはどうすればよいですか? 特定のフィールドを変更可能にしますか?
曖昧でごめんなさい。