Java 类方法检查它';s自己的成员不是';t空?

Java 类方法检查它';s自己的成员不是';t空?,java,nullpointerexception,Java,Nullpointerexception,我有一个模型类,它表示数据库中的一个表。 该表有7列,因此该类有7个属性。其中一些允许为null,其他则不允许 因此,当我将一个人传递给公共函数时,我会检查notallowbenull属性是否为null。和普通支票一样 if(person.getName() == null || person.getSurname() == null ...) throw new NullPointerException(); 我现在想知道在Person类中创建一个基本上就是这样做的函数是否有任何缺

我有一个模型类,它表示数据库中的一个表。 该表有7列,因此该类有7个属性。其中一些允许为null,其他则不允许

因此,当我将一个人传递给公共函数时,我会检查notallowbenull属性是否为null。和普通支票一样

if(person.getName() == null || person.getSurname() == null ...)
     throw new NullPointerException();
我现在想知道在Person类中创建一个基本上就是这样做的函数是否有任何缺点?像

public void checkFullDataset()
{
   if(name == null || surname() == null ...)
       throw new NullPointerException();
   return;
}
因此,每当我与某人一起工作时,我都会调用此方法,而不是手动测试所有字段。如果将来更改表(添加新字段、更改空/非空行为等),也会有好处,因为我只需要更改此函数,而不需要更改代码中的许多“如果”。

两个想法:

  • 最好禁用空构造函数,引入一个将所有字段作为参数的构造函数,并将检查放在那里

  • 如果您想添加这样的方法,它最好使会话返回类似于标准的
    check
    函数的
    boolean
    ,如
    hasElement()
    hasNext()
    iEmpty()
    等,并让用户处理它

    public boolean checkFullDataset() {
       if(name == null || surname() == null ...)
         return false;
        return true;
    }
    

  • 处理您的需求的最佳解决方案是使您的
    Person
    类不可变,并在初始化时使用Builder模式检查必填字段,然后再使用永不


    看看这个示例:

    您似乎发现了“类不变量”的概念。有一些编程语言,例如,
    Eiffel
    ,其中语言在进入和退出类的每个公共函数之前检查约束,如果不满足这些约束,则抛出异常;基本上是你自己在做什么

    也要查找函数的前置条件和后置条件,类似的概念


    根据代码的不同,您可能会发现检查是一个性能问题,在这种情况下,您可以对生产代码禁用它们

    我可能会使用一个布尔返回值,类似于
    public boolean isDataValid()
    ,您可以使用它来检查字段是否已设置,而不会引发异常,然后可选地进一步验证(缺少哪个字段等)或抛出异常。那么,你只是问你的方法是否好?我进一步考虑更改方法,以便根据哪个属性为null,我抛出另一个NPE->if(name==null)抛出新的NPE(“name不允许为null”);如果(姓氏==null)抛出新的NPE(“surenam不允许为null”)等等,这就是为什么我想抛出NPE而不是返回布尔值。:)将方法名称更改为
    validateDataSet
    (建议)。您可以这样做,但若用户不调用此方法怎么办?如果这不好,构造函数路由甚至不允许您在没有合法属性的情况下实例化对象。根据需要进行调用。问题是对象(person)是从数据库中的表中创建的,该表可以有空值,因此在创建对象时不能禁止空值。确定。在这种情况下,您可能希望有这样的方法,并确保它被调用。根据建议,如果愿意,请将方法的名称更改为“更合适/更直观”。