阅读后:
高效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的方法假设不匹配时抛出异常。它运行得很好。