クラスは、オプションのパラメータがたくさんある場合は、コンストラクタまたは静的なファクトリメソッドを使用してオブジェクトを作成する非常に面倒になります。通常、いくつかの方法でこれを持っています:
- コンストラクタのオーバーラップ
このモードでは、第1の構成を提供するためだけに必要なパラメータ、第二の構成は、オプションのパラメータを有し、第三は、2つのオプションのパラメータを有している、というように、コンストラクタを含む最後次のようなすべてのオプションのパラメータ、
public class Person {
//必要参数
private final int id;
private final String name;
//可选参数
private final int age;
private final String sex;
private final String phone;
private final String address;
private final String desc;
public Person(int id, String name) {
this(id, name, 0);
}
public Person(int id, String name, int age) {
this(id, name, age, "");
}
public Person(int id, String name, int age, String sex) {
this(id, name, age, sex, "");
}
public Person(int id, String name, int age, String sex, String phone) {
this(id, name, age, sex, phone, "");
}
public Person(int id, String name, int age, String sex, String phone, String address) {
this(id, name, age, sex, phone, address, "");
}
public Person(int id, String name, int age, String sex, String phone, String address, String desc) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.phone = phone;
this.address = address;
this.desc = desc;
}
}
あまりにも多くのコンストラクタコードが非常に肥大化されるようになりますが、あなたがオブジェクトを作成するときには、エラーのパラメータリストの順番に簡単に検出することは困難であるため。
- JavaBeanは
、必要な各パラメータを設定するセッターの方法を呼び出し、オブジェクトを作成するために、引数なしのコンストラクタを呼び出して、そのように関連する任意のパラメータの各々に:
public class Person {
//必要参数
private int id;
private String name;
//可选参数
private int age;
private String sex;
private String phone;
private String address;
private String desc;
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setSex(String sex) {
this.sex = sex;
}
public void setPhone(String phone) {
this.phone = phone;
}
public void setAddress(String address) {
this.address = address;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
コンフィギュレーションモードを重ねるの不足のため、このモデルアップ。簡単こうして生成されたコードを読み取り、作成の例は、非常に簡単でもあるが、欠点があります。設定手順は、JavaBeanのは、一貫性のない状態にあってもよいビルドプロセスにおけるいくつかのコールに割り当てられず、このモードでは、もはやクラスであります不変の状態、スレッドセーフ。簡単に言えば、JavaBeanのモードatomic構文オブジェクトが破壊されています。
- ビルダー(ビルダー)モード、
第3の選択肢があり、セキュリティ上のパターン像を確保するために、両方のは、ビルダーとして重畳するだけでなく、そうJavaBeansのモードとして、良好な可読性を確保します。これは、直接、目的のオブジェクトを生成しませんが、クライアントは、コンストラクタ(または静的工場)を呼び出しビルダーオブジェクトを取得するために必要なすべてのパラメータを活用できるように、ビルダーモードの一形態です。その後、クライアントは、該当する各オプションのパラメータを設定するためのビルダーオブジェクトのセッターに似たメソッドを呼び出します。最後に、クライアントは、参照方法を生成するビルダーは不変オブジェクトではありません呼び出します。ビルダーは、そのクラスを構築するためのクラスの静的メンバです。
public class Person {
//必要参数
private final int id;
private final String name;
//可选参数
private final int age;
private final String sex;
private final String phone;
private final String address;
private final String desc;
private Person(Builder builder) {
this.id = builder.id;
this.name = builder.name;
this.age = builder.age;
this.sex = builder.sex;
this.phone = builder.phone;
this.address = builder.address;
this.desc = builder.desc;
}
public static class Builder {
//必要参数
private final int id;
private final String name;
//可选参数
private int age;
private String sex;
private String phone;
private String address;
private String desc;
public Builder(int id, String name) {
this.id = id;
this.name = name;
}
public Builder age(int val) {
this.age = val;
return this;
}
public Builder sex(String val) {
this.sex = val;
return this;
}
public Builder phone(String val) {
this.phone = val;
return this;
}
public Builder address(String val) {
this.address = val;
return this;
}
public Builder desc(String val) {
this.desc = val;
return this;
}
public Person build() {
return new Person(this);
}
}
}
人はデフォルトのパラメータ値のすべてを別の場所に配置され、この場合、不変です。ビルダーのセッターメソッドは、ビルダー自身を返します。