具有空对象模式的DAO

时间:2016-10-17 08:56:44

标签: java nullpointerexception null dao null-object-pattern

阅读后:
有效的Java(见第43项) - Joshua Bloch
清洁代码(不要归零) - 鲍勃叔叔 Avoiding != null statements
Null Object pattern

我一直在寻找答案,当搜索最终成为非收集对象不存在的实体时,DAO应该返回什么。 通过使用空数组或emptyList方法,集合对象确实可以。但是对于非收藏品,它可能会更难。另一种解决方案是永远不会返回null,而是使用Null Object模式。 但是我不知道将Null对象模式与DAO集成,我真的很高兴看到与Null对象模式和DAO模式的完美集成,特别是对于模型(dto)对象返回情况。

我很感激并欢迎任何最佳设计模式,场景和建议。

3 个答案:

答案 0 :(得分:17)

确实引入null引用可能是编程语言历史上最糟糕的错误之一,即使它的创建者Tony Hoare将其称为十亿美元的错误

根据您的null版本,以下是Java的最佳替代方法:

1。 Java 8及以上

Java 8 开始,您可以使用java.util.Optional

以下是您在案例中如何使用它的示例:

public Optional<MyEntity> findMyEntity() {
    MyEntity entity = // some query here
    return Optional.ofNullable(entity);
}

2。在Java 8

之前

Java 8 之前,您可以使用 Google Guava 中的com.google.common.base.Optional

以下是您在案例中如何使用它的示例:

public Optional<MyEntity> findMyEntity() {
    MyEntity entity = // some query here
    return Optional.fromNullable(entity);
}

答案 1 :(得分:6)

您需要做的就是返回一个空对象 - 比如您在DAO中拥有的客户条目

if(result == null){return new EmptyUser(); }

其中EmptyUser扩展User并将相应的条目返回到getter调用,以允许其余代码知道它是一个空对象(id = -1等)

一个小例子

public class User {
    private int id;
    private String name;
    private String gender;
    public String getName() {
       //Code here
    }
    public void setName() {
       //Code here
    }
}

public class EmptyUser extends User {

    public int getId() {
       return -1;
    }

    public String getName() {
       return String.Empty();
   }
}

public User getEntry() {
   User result = db.query("select from users where id = 1");
   if(result == null) {
       return new EmptyUser();
   }
   else {
       return result;
    }
}

答案 2 :(得分:2)

根据我的经验,在应该返回单个实体的现实场景中,返回null实际上要么是数据不一致错误,要么是缺少数据。在这两种情况下,真正做的好事就是创建并抛出自己的DataNotFoudException快速失败

我使用mybatis作为ORM,最近我开始编写一些理论上单结果映射器选择作为返回列表并验证检查dao中返回数据的数量,并在返回的数量与dao不匹配时抛出异常&# 39;方法假设。它运作得很好。