假设我们有User
和UserBuilder
类在自己的包,我们想成为不可改变的,在初始化之前一致的状态,定义如下:这是建造者模式的有效变体吗?
public class User {
private final String firstName, lastName;
private final int age;
private final String adress;
protected User(UserBuilder buildUser) { //constructor acessible only in same packge
this.firstName = buildUser.lastName;
this.lastName = buildUser.lastName;
this.age = buildUser.age;
this.adress = buildUser.adress;
}
public String getFirstName() {
return firstName;
}
... // and other getters
}
和建造类,如下所示:
public class UserBuilder {
public final String firstName;
public final String lastName;
public int age;
public String adress;
public UserBuilder(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public UserBuilder setAge(int age) {
this.age = age;
return this;
}
public UserBuilder setAdress(String adress) {
this.adress = adress;
return this;
}
public UserBuilder getUser() {
return this;
}
public User build() {
return new User(getUser());
}
}
最后,我们建立类用户是在另一个包:
public static void main(String[] args) {
User user = new UserBuilder("John","Doe")
.setAge(22)
.build();
// User user = new User(UserBuilder) //error protected constructor
}
这是否被认为是安全和良好的设计?如果不是,为什么?
我想避免嵌套的建设者,因为我觉得它会降低代码的可读性。我知道如果你有嵌套的构建器,你可以有私有构造器。 –
然后选择默认的用户构造函数可见性,但不保护 – Nyavro
但是,然后你可以通过调用User的构造函数并使用UserBuilder实例,可以或不可以完全初始化,这使得整个练习有Builder无意义。 –