我应该检查调用对象是否为空?
例如:
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?
}
}
答案 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
设置的不变量。