返回空数据结构(实体)而不是null,是不是很好?

时间:2012-07-01 01:20:11

标签: java entity

我一直致力于一个由其他开发人员开发的项目。在此项目中,任何返回实体或对象的方法都旨在返回一个名为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);
}

3 个答案:

答案 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。