,我已經遇到網上通常有這樣的事情嵌套生成器模式:Java的嵌套生成器模式重複字段
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
?它看起來像很多冗餘代碼。而我的第二個問題是,下面的代碼是否會成爲一個可行的替代品,爲什麼?爲什麼?
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
。
在第二個例子中,您完全擊敗了構建器的要點。構建器構建_complete_,_valid_和_immutable_實例 - 現在您無法完成這些任務。更糟糕的是,構建器可以在調用'build'後修改構建的對象**。我沒有看到「重複的字段」有任何問題 - 但是您提出的替代方案非常糟糕。 –
我明白你的意思了,謝謝你的反饋 – user2914191
什麼樣的第一個評論說是不對的恕我直言。在構建方法被調用之前,構建器可以做任何它需要做的事情。而且你的代碼沒有被證明是錯誤的或正確的(這取決於你沒有顯示的代碼)。建設者可以在建立過程中隨意修改對象。唯一的必須是構建器之外的任何人都不能修改它,並且一旦構建方法被稱爲noone(甚至不是構建器)都可以修改它。你展示的人的成員是私人的,不變的,所以一切都很好。這裏的關鍵是如果你有一個公開的二傳手。 –