8

阅读后:
Effective Java (参见 Item 43) - Joshua Bloch
Clean Code (Don't Return Null) - Uncle Bob
Avoiding != null statements
Null Object pattern

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

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

4

3 回答 3

21

事实上,引入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之前,您可以com.google.common.base.OptionalGoogle Guava使用。

这是一个如何在您的情况下使用它的示例:

public Optional<MyEntity> findMyEntity() {
    MyEntity entity = // some query here
    return Optional.fromNullable(entity);
}
于 2016-10-20T11:21:14.750 回答
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;
    }
}
于 2016-10-17T08:59:12.277 回答
2

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

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

于 2016-10-21T07:19:53.460 回答