具有空对象模式的DAO

Ye *_*Win 7 java null dao nullpointerexception null-object-pattern

阅读后:
有效的Java(参见条款43) - Joshua Bloch
清洁代码(不要返回空) - Bob叔叔
避免!= null语句
Null对象模式

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

我将非常感谢并欢迎任何最佳设计模式,场景和建议.

Nic*_*tto 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);
}
Run Code Online (Sandbox Code Playgroud)

2.之前 Java 8

之前的Java 8,你可以使用com.google.common.base.Optional谷歌番石榴.

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

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

  • 使用Optional,表示返回值的基数为0或1.因此它给出了一个明确的描述,即没有任何价值,让调用者决定如何处理它 (2认同)

The*_*ter 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;
    }
}
Run Code Online (Sandbox Code Playgroud)