【问题标题】:Which way to create an object when inputting data?输入数据时用哪种方式创建对象?
【发布时间】:2016-10-23 16:43:07
【问题描述】:

我有 Person 类,我想输入用户的数据,如名字、年龄、性别、体重等。(我想使用 Scanner 类。)

我应该如何处理输入数据来创建Person类的对象? 我考虑了以下选项,并想知道使用哪一个。

1) 在 START 处创建一个带有无参数构造函数的 Person 对象,然后 - 输入一条数据(例如名字) - 使用 Person 的 SETTER 在上述对象中设置此数据 - 对其他数据重复上述步骤 最后将对象发送到 PersonDAO

缺点:如果我为 Person 类包含一个无参数构造函数,我有点允许在程序的其他地方创建一个“空的”无效 Person 对象。 (我不确定我是否真的应该担心这个。)

2) 在 END 处创建一个带有多参数构造函数的 Person 对象。 - 首先逐个输入数据,并将它们保存在数组/列表/变量中。 - 完成输入后,从数组/列表/变量中提取数据片段,并通过将它们放入 Person 的构造函数来创建一个 Person 对象(一个具有许多参数) 最后将对象发送到 PersonDAO。

缺点:如果其中一个论点无效,我会很晚才知道这一点。整个过程看起来比较复杂。

那么哪个选项更好呢?在将输入数据发送到 DAO 之前,也许还有其他处理输入数据的方法......

我猜,DAO 将使用对象的 GETTERS 在数据库中创建记录?

【问题讨论】:

    标签: validation input constructor builder multiparameter


    【解决方案1】:

    我建议使用 Builder 设计模式。 它看起来像:

    public final class Person {
        private String firstName;
        private String lastName;
        private int age;
    
        private Person() {}
    
        public String getFirstName() {
            return firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public int getAge() {
            return age;
        }
    
        public static Builder newBuilder () {
            return new Person(). new Builder();
        }
    
        public class Builder {
            public Builder setFirstName(String firstName) {
                //validate concrete params here with RuntimeExceptions
                Person.this.firstName = firstName;
                return this;
            }
    
            public Builder setLastName(String lastName) {
                Person.this.lastName = lastName;
                return this;
            }
    
            public Builder setAge(int age) {
                Person.this.age = age;
                return this;
            }
    
            public Person build() {
                //validate filling of Person here
                return Person.this;
            }
    
        }
    }
    

    所以你的班级:

    • 可以有任意数量的初始化参数
    • build 方法中验证类是否准备就绪
    • 类变得不可变
    • 封装的构造函数

    【讨论】:

    • 如果我将 Builder 创建为嵌套的静态类会有所不同吗?
    • 没有区别,只是模式的另一种实现。但是如果使用嵌套类,你应该在构建器中复制主类的字段,这就是为什么我更喜欢内部类实现,因为它更扁平。
    • 还有两个问题:1) 如果Builder 可以直接访问Person 的实例变量,难道我们不会破坏Person 类的封装吗? 2) 使用无参数构造函数,我们必须深入研究 build() 方法的实现,以找出是什么构成了有效的 Person 对象。没事吧?
    • @enhancedJack 1) 不,我们不会破坏封装,因为 builder 对象是内部类,它就像是附加属性\方法的容器。它严格依赖于父类,没有它就不会使用。对于任何其他类 Person 正确地隐藏了它的实现 2) 正如我之前所说,如果你喜欢它,你可以使用嵌套类。使用内部类是的,您应该在build 方法中执行验证。
    • 在编译时了解我们构建的对象有效/无效的有趣方式:blog.frankel.ch/a-dive-into-the-builder-pattern/#gsc.tab=0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 2018-08-27
    相关资源
    最近更新 更多