java - 我的构建器对象的实现有哪些缺点?

标签 java oop builder

我想知道我的构建器对象实现与我在大多数站点上看到的构建器对象实现相比是否有缺点。我知道为只有 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;
        }   
    }
}

在互联网上找到的构建器对象( 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);
        }   
    }
}

第二种实现似乎很麻烦,因为构建器需要具有与其要构建的对象完全相同的字段(阅读:编写相同的代码两次)。 对我来说,构建器创建新的 User 并填充其字段似乎更自然,而不是使用它自己的实例调用 User 的构造函数。 p>

这两个示例都可以通过以下方式进行测试:

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());
    }

所以我的问题是: 我的构建器对象的实现有哪些缺点?我真的不能告诉任何(我并不是说没有)所以我想听听一些反馈!或者我的代码也是构建器对象的有效实现?

最佳答案

实现的区别在于,如果您想创建多个相等(或相似)但不相同的对象,则必须创建一个新的Builder,而使用其他实现时您可以这样做这个:

Builder b = new User.Builder();
User john = b.firstName("John").lastName("Smith").build();
User jack = b.firstName("Jack").build();

关于java - 我的构建器对象的实现有哪些缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30323895/

相关文章:

c++ - 我收到 "undefined reference"错误,我不明白为什么 (C++ OO)

c# - 是否使用扩展方法将实现添加到反 OOP 接口(interface)?

java - 接口(interface)的实现必须实现其内部类构建器接口(interface)。怎么做?

java - 如何从 Lombok builder 中排除属性(property)?

xml - Ruby XML Builder 的特殊字符

java - CameraX PreviewView 不显示任何内容

java - 在 Maven 多模块项目的各个模块的测试之间保留 h2 数据库

java - 使用外部类来处理条形码扫描仪输入?

java - vector 和数组列表哪一个更好用?

java - 将 JAX-WS 版本 2.2.1 升级到 2.2.8 后的 NPE