具有 Null Object 模式的 DAO

DAO with Null Object Pattern

阅读后:
有效 Java(参见第 43 项)- Joshua Bloch
干净的代码(不要 Return Null)- Bob 叔叔
Avoiding != null statements
Null Object pattern

我一直在寻找一个问题的答案,即当搜索最终针对的实体在 non-collection object 时不存在时,DAO 应该 return . Collection object 用空数组或emptyList方法确实可以。但是使用 non-collections 可能会更难。另一种解决方案是从不 return null 而是使用 Null Object 模式。 但是我不知道将 Null Object 模式与 DAO 集成,我真的很高兴看到与 Null Object 模式和 DAO 模式的完美集成,特别是对于模型(dto)object return 案例.

我将不胜感激并欢迎任何最佳设计模式、方案和建议。

您需要做的只是 return 一个空对象 - 假设您在 DAO 中有一个客户条目,例如

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

其中 EmptyUser 将 User 和 return 的适当条目扩展到 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;
    }
}

确实引入 null 引用可能是编程语言历史上最严重的错误之一,甚至它的创建者 Tony Hoare 称它为他的 十亿美元的错误.

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

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 22=]

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

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

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

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