在输入数据时以哪种方式创建对象?

时间:2016-10-23 16:43:07

标签: validation input constructor builder multiparameter

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

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分: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方法
  • 中验证该类已准备就绪
  • 类变为不可变
  • 封装构造函数