我一直致力于一个由其他开发人员开发的项目。在此项目中,任何返回实体或对象的方法都旨在返回一个名为EMPTY_VALUE
的特殊值。
public Customer getCustomer() {
if (everythingFine) {
return realCustomer();
} else {
Customer.EMPTY_VALUE;
}
}
客户类:
public class Customer {
public static final Customer EMPTY_VALUE = new Customer();
private String firstName;
private STring lastName;
public Customer() {
this.firstName = "";
this.lastName = "";
}
}
在其他使用getCustomer()方法的地方:
Customer customer = getCustomer();
if (customer != Customer.EMPTY_VALUE) {
doSomething(customer);
}
上述方法是否比null
检查有任何优势?它给我们买了什么吗?
Customer customer = getCustomer();
if (customer != null) {
doSomething(customer);
}
答案 0 :(得分:5)
我会说既不。不要从方法返回null
或返回特殊“错误对象”。让他们抛出异常。这样,每次调用它时都不需要“检查”。
public Customer getCustomer() {
if (everythingFine) {
return realCustomer();
throw new NoCustomerException();
}
使用该方法的代码会更简单:
doSomething(getCustomer());
它可能(如上例所示)是运行时异常或已检查的异常。
如果您必须在两者之间进行选择,我会选择非null变体,就像我选择从方法而不是null
返回空列表一样。但是,我会建议您不要编写任何特殊代码来处理该特殊对象,它应该像任何其他客户一样处理。
答案 1 :(得分:4)
这是Null Object Pattern的一个例子。优点是您可以通过仅使用执行默认行为的对象来删除显式空检查。在这种情况下,null对象在查询其字段时返回空字符串,所以如果这是你想要的结果,无论如何,你只是保存了一个null的检查。显然,与所有设计模式一样,它的用处取决于具体情况。
答案 2 :(得分:4)
我不喜欢创建虚拟空Customer对象的想法。它的语义是什么?它是真正的客户吗?
在这种情况下,我更喜欢使用Guava中的Optional,或者根据客户端代码使用null
。阅读链接中的说明以查看常用用途和可选API。