验证构造函数输入的最佳位置



我不确定验证构造函数输入位置的最佳实践是什么,我可以将逻辑放在构造函数之外或接受输入并执行逻辑以检查构造函数内部

对于我当前的验证,我从 csv 中读取一行,拆分逗号上的字段并检查是否有正确数量的字段和正确的大小,然后将它们传递给构造函数。在构造函数中执行此类验证并引发异常会更好吗?

调用构造函数的代码:

while (fileIn.hasNextLine()) {
    String line = fileIn.nextLine();
    String[] fields = line.toUpperCase().split(",");
        if(!fields[0].isEmpty()) {
            objects.add(new Object(fields));
        }else{
            System.out.println("Invalid field from file");
        }
}

对象构造函数当前:

    public Object(String[] objectFields ) {
        super();
        this.objectNameType = objecctFields[0];
        this.objectNum = objectFields[1];
        }

我想做什么,但不确定这是否是一个好的做法:

    public Object(String[] fields ) {
        super();
            if(!fields[0].isEmpty()){
                this.objectNameType = fields[0];
                this.objectNum = fields[1];
            }else{
                System.out.println("Error");
            }
        }

这取决于。如果你按照你想要的方式做,你可能仍然在打电话给

objects.add(new Object(fields));

但是,如果字段 [0] 为空,则将向对象数据结构添加一个空对象。就个人而言,我会按照您当前设置的方式进行操作,这样您就不会冒将空对象添加到"对象">

的风险

任何方法或构造函数通常最好尽快验证其参数值。您可以记录此类限制并快速失败,给出正确的异常。

如果传递了无效参数,并且您无法检查其有效性,则许多事情都可能出错。该类的其他方法可能会失败并出现一些令人困惑的异常,或者更糟糕的是,它可能会给出一些更难调试的错误结果。

在您的情况下,我认为这并不重要,但是在构造函数中进行验证不是一个好的做法。假设您的类 Object 是多个类的子类,并且它们具有许多在声明时初始化的字段。在这种情况下,所有超类层次结构及其字段都将在验证之前初始化。现在,在所有这些初始化过程(可能很耗时(之后,由于字段为 null,您抛出异常 - 这没有意义。因此,我建议在调用构造函数之前或通过静态工厂方法进行验证。

最新更新