元記事&体験まとめ&大工場体験記 波瀾万丈の人生、すべては陽のあたる場所へ
問題点
静的ファクトリとコンストラクタの共通の特徴は、複数のオプション・パラメータをサポートできないことです。複数のオプションパラメーターを持つオブジェクトを構築する場合、一般的な方法はオーバーラップコンストラクターとJavaBeanの方法です:
オーバーラップコンストラクタ
必須パラメータだけを持つコンストラクタ、1つのオプションパラメータを持つ2番目のコンストラクタ、2つのオプションパラメータを持つ3番目のコンストラクタ......と、最後のコンストラクタにすべてのオプションパラメータが含まれるまで、コンストラクタを用意します。
短所:Overlapping Constructorパターンは、オプションのパラメータが多く、呼び出し元が各パラメータの意味を知りたがり、各パラメータの意味を確認するためにソースコードを読み込む必要がある場合、コードの可読性が低下します。複数のパラメータが同じ型である場合、微妙なエラーが発生する可能性があり、呼び出し元はパラメータの位置を逆にし、エラーを報告せずにコンパイルします。
JavaBeanパターン
オブジェクトはパラメータなしのコンストラクタで生成され、セッター・メソッドを呼び出して必要なパラメータを設定します。これによりインスタンスの生成が簡単になり、セッターのメソッド名でどのパラメータが設定されているのかがわかるので、結果としてコードが読みやすくなります。
欠点:構築プロセスは、いくつかの呼び出しに分割され、構築プロセスでは、JavaBeanの一貫性を保証することはできません、スレッドセーフティ問題になりやすい。
では、複数のオプション・パラメーターを持つオブジェクトを構築する場合はどうすればよいのでしょうか?
回答
Builder メソッドを使用すると、複数のオプション・パラメータを持つオブジェクトを構築できます:
public class User {
private String userName;
private int age;
//オプションのパラメータ
private String address;
private String phoneNumber;
public static class Builder{
private String userName;
private int age;
//オプションパラメーターのデフォルト値
private String address="";
private String phoneNumber="";
public Builder(String userName, int age){
this.userName = userName;
this.age = age;
}
public Builder address(String address){
this.address = address;
return this;
}
public Builder phoneNumber(String phoneNumber){
this.phoneNumber = phoneNumber;
return this;
}
public User build(){
return new User(this);
}
}
private User(Builder builder){
this.userName = builder.userName;
this.age = builder.age;
this.address = builder.address;
this.phoneNumber = builder.phoneNumber;
}
User user = new User.Builder("test",18).address("test").phoneNumber("test").build();もし制約のいずれかに違反した場合、ビルドメソッドはエラーメッセージを投げる必要があります。Builder パターンは、1 つのビルダで複数のオブジェクトをビルドできるほど柔軟です。唯一の欠点は、オブジェクトを作成するために中間オブジェクトを作成しなければならないことであり、ビルダパターンは構築プロセスをより長くします。
結論
クラスのコンストラクタまたは静的ファクトリが1つ以上のパラメータを持っている場合、この種のクラスを設計するとき、Builderパターンは良い選択です、特にパラメータのほとんどがオプションの場合、従来の重複コンストラクタのパターンのプロジェクトを使用すると、Builderパターンのコードの使用は、より読みやすいだけでなく、JavaBeanの方法よりも安全です。





