具有Null对象模式的DAO



阅读后:
高效Java(见第43项(-Joshua Bloch
干净代码(不返回Null(-Bob叔叔
回避!=null语句
空对象模式

我一直在寻找一个问题的答案,即当搜索结果是非集合对象不存在的实体时,DAO应该返回什么。通过使用空数组或emptyList方法,Collection对象确实可以。但对于非收藏品来说,这可能会更加困难。另一种解决方案是永远不返回null,而是使用null对象模式。但我不知道将Null对象模式与DAO集成,我真的很高兴看到Null对象模式和DAO模式的良好集成,尤其是对于模型(dto(对象返回情况。

我将感谢并欢迎任何最好的设计模式、场景和建议。

事实上,引入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

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

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

您所需要做的就是返回一个空对象,比如说您在DAO中的客户条目,类似

if(result==null({返回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;
    }
}

根据我的经验,在现实生活中,单个实体返回null实际上要么是数据不一致错误,要么是缺乏数据。在这两种情况下,真正的好办法是装箱并投掷自己的DataNotFoudException快速失败

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

相关内容

  • 没有找到相关文章

最新更新