我想知道,与我在大多数网站上看到的构建器对象实现相比,我的构建器对象的实现是否有缺点.我知道为一个只有2个字段的类实现一个构建器对象实在是太过分了,但这些仅仅是示例,意味着很小.
我的实施:
public class User {
private String firstname;
private String lastname;
public String getFirstname() {
return firstname;
}
public String getLastname() {
return lastname;
}
private User(){}
public static class Builder{
private final User user;
public Builder(){
user = new User();
}
public Builder firstname(String firstname){
user.firstname = firstname;
return this;
}
public Builder lastname(String lastname){
user.lastname = lastname;
return this;
}
public User build(){
return user;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在互联网上找到的构建器对象(example1 example2):
public class User {
private String firstname;
private String lastname;
public String getFirstname() {
return firstname;
}
public String getLastname() {
return lastname;
}
private User(Builder builder){
this.firstname = builder.firstname;
this.lastname = builder.lastname;
}
public static class Builder{
private String firstname;
private String lastname;
public Builder firstname(String firstname){
this.firstname = firstname;
return this;
}
public Builder lastname(String lastname){
this.lastname = lastname;
return this;
}
public User build(){
return new User(this);
}
}
}
Run Code Online (Sandbox Code Playgroud)
第二个实现看起来很麻烦,因为构建器需要与它将构建的对象具有完全相同的字段(读取:编写相同的代码两次).对我来说,构建器创建new User并填充其字段,而不是调用User带有它自己的实例的构造函数似乎更自然(对我而言).
这两个例子都可以测试:
public static void main(String[] args) {
User u = new User.Builder().firstname("Tom").lastname("Jonckheere").Build();
System.out.println(u.getFirstname());
System.out.println(u.getLastname());
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:我实现构建器对象有哪些缺点?我真的不能告诉任何人(我不是说没有)所以我想听一些反馈!或者我的代码也是构建器对象的有效实现?
实现的不同之处在于,如果要创建多个相等(或相似)但不相同的对象,则必须创建新对象,Builder而使用其他实现,您可以执行此操作:
Builder b = new User.Builder();
User john = b.firstName("John").lastName("Smith").build();
User jack = b.firstName("Jack").build();
Run Code Online (Sandbox Code Playgroud)