,我已经遇到网上通常有这样的事情嵌套生成器模式: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(甚至不是构建器)都可以修改它。你展示的人的成员是私人的,不变的,所以一切都很好。这里的关键是如果你有一个公开的二传手。 –