class Person{
private int id;
private String name;
private int age;
... so on
private Person(Builder builder){
this.id = builder.id;
this.name = builder.name;
this.age = builder.age;
}
public static class Builder{
private int id;
private String name;
private int age;
... so on
public Builder id(int id){
this.id = id;
return this;
}
public Builder name(String name){
this.name = name;
return this;
}
.... so on
public Person build(){
return new Person(this);
}
}
}
私の質問ですが、それはPerson
とBuilder
のフィールドを複製する必要があるのでしょうか?それは冗長なコードのように思える。そして私の2番目の質問は、次のコードが実行可能な代替品になるのか、なぜ、なぜそうではないのでしょうか?
class Person{
private int id;
private String name;
private int age;
... so on
private Person(){}
public static class Builder{
private Person person = new Person();
public Builder id(int id){
this.person.id = id;
return this;
}
public Builder name(String name){
this.person.name = name;
return this;
}
.... so on
public Person build(){
return person;
}
// UPDATED -- another build method
public Person build(){
Person built = this.person;
this.person = new Person();
return built;
}
}
}
注:私はこのトピックは独断することができると「正しい」答えがないことも理解して、私はちょうど別のアイデアや意見を聞きたいです。私はultimate truth
を探していません。
2番目のインスタンスでは、ビルダーのポイントを完全に破棄しました。ビルダーが_complete_、_valid_および_immutable_インスタンスをビルドします。あなたのインスタンスはこれらのものを一切持たないようになりました。さらに悪いことは、**ビルドが呼び出された後にビルダーがビルドされたオブジェクトを変更できることです。私は "重複フィールド"には何の問題も見ません - しかしあなたの提案された選択肢はひどいです。 –
フィードバックのおかげで何を意味するのか見る – user2914191
最初のコメントは正しいIMHOではないと言いました。ビルダーは、ビルドメソッドが呼び出される前に、必要な処理を行うことができます。そしてあなたのコードは間違っているか正しくないことを証明していません(あなたが表示していないコードに依存します)。ビルダーは、ビルド中にオブジェクトを変更することができます。唯一のことは、ビルダーの外に誰もそれを変更できなければならないことです。そして、ビルドメソッドが一度もnoone(ビルダーさえも)と呼ばれると、それを変更することができます。 Personのメンバーはプライベートで不変なので、すべてうまくいきます。ここで重要なのは、あなたがパブリックセッターを持っているかどうかです。 –