accessor方法是否应检查java中的调用对象是否为null?

时间:2014-11-14 05:42:37

标签: java

我应该检查调用对象是否为空?

例如:

public class Some
{
    private int number;
    private String name;

    public Some()
    {
        number = 0;
        name = "no name";
    }

    public String get() 
    {
        return name; //Should I check if the calling object is null?
    }
}

5 个答案:

答案 0 :(得分:2)

只有你想要比教皇更圣洁。

当你获得对象本身时,你应该检查空值,并且只有在调用了对象上的任何方法之后:

if (some == null){
   // do something: send an error message / throw exception / ignore
} else {
    System.out.println(some.get());
    System.out.println(some.getOtherStuff());
    ....
}

答案 1 :(得分:2)

如果通过“检查调用对象是否为空”表示“检查get()调用的结果是否为null”,则答案是“,这取决于您的用例。 “对于您的使用案例,name的值绝不会是null,因此检查它的好处很少。

通常情况下,吸气剂就是吸气剂。他们只获取数据,甚至是null

如果您要使用该值并且您期望它为非null,那么您肯定应该在使用它的方法中检查null

答案 2 :(得分:0)

我假设calling object表示调用该方法的对象,例如

String name = callingObject.get();

现在callingObject在方法中变为this,而this 永远永远get()方法中为空。如果callingObject为空,则JVM会在之前抛出NullPointerException 而不是调用get().

答案 3 :(得分:0)

我认为访问者不负责验证自己的对象。 简单地说就是这样:除非真的有狗,否则你无法获得狗的重量。

相反,调用访问器的方法负责确保对象确实存在。

public class Lab {
    List<Dog> dogs;

    public float getAveDogWeight() {
         float sum = 0.0f;
         float ave = 0.0f;

         if (null != dogs && dogs.size > 0) {
             for (Dog dog : dogs) {
                 if (null != dog) {
                     sum += dog.getWeight();
                 }
             }
             ave = // calculate ave here
         }

         return ave;
    }
}

答案 4 :(得分:0)

Getters不应该验证数据。你是从错误的方向接近这个。

首先,您需要为对象定义规则:其参数的有效值是什么?这些规则称为不变量。

然后,使用 setters 验证数据,以确保不变量始终保持不变。换句话说,使用setter来确保违反规则的对象不存在

如果您在getter中验证,那么您在之后检查无效字段。在这一点上真的已经太晚了。

然后,除了反射的奇怪用法(也是反序列化是一个单独的问题),你保证你的getter也会返回不违反规则的值。例如,假设“人”必须具有非空名称,并且必须具有&gt;的年龄。 0和&lt; = 150:

class Person {

    private String name;
    private int age;

    // Constructor uses setters to perform validation.
    // Throws IllegalArgumentException on invalid parameter.
    public Person (String name, int age) {
        setName(name);
        setAge(age);
    }

    // Setter validates name.
    public final void setName (String name) {
        if (name == null)
            throw new IllegalArgumentException("Invalid name specified.");
        this.name = name;
    }

    // Setter validates age.
    public final void setAge (int age) {
        if (age <= 0 || age > 150)
            throw new IllegalArgumentException("Invalid age specified."); 
        this.age = age;
    }

    // Guaranteed to return a non-null name.
    public final String getName () {
        return this.name;
    }

    // Guaranteed to return an age > 0 and <= 150.
    public final int getAge () {
        return this.age;
    }

}

另请注意,我在这里制作了吸气剂和制定者final。由于这些参数具有规则,这将阻止子类覆盖getter / setter并可能破坏我们为Person设置的不变量。