知道这个模式还是通过《重构》,这个模式的出现还是了为了解决代码重复的坏味道。在项目中很经常见到类似下面这样的代码:
我们在很多地方有类似的检查对象是否为null,如果为null,需要一个默认值等等这样的场景。显然,代码重复是坏味道,怎么消除这个坏味道呢?答案就是使用NullObject替代之,Null Object继承原对象。
那么,原来的代码可以改写为:
如果Null Object的引入仅仅是带来这个好处,似乎没有理由让我们多敲这么多键盘。问题的关键是类似上面这样的判断也许出现在很多处,那么有价值的技巧出现了,我们在NullObject覆写getCost,提供缺省值:
请注意,只有那些大多数客户端代码都要求null object做出相同响应时,这样的行为才有意义。比如我们这里当工程id为null,很多地方要求费用就默认为0.0。 特殊的行为我们仍然使用isNull进行判断。
当然,另外在需要返回NullObject的地方,你应该创建一个null object以替代一般的对象,我们可以建立一个工厂方法:
Null Object模式带来的好处:减少了检查对象是否为null的代码重复,提高了代码的可读性,通常这些Null Object也可以为单元测试带来简便。
if(prj.getProjectId==
null)
plan.setCost(0.0);
else
plan.setCost(prj.getCost());
plan.setCost(0.0);
else
plan.setCost(prj.getCost());
我们在很多地方有类似的检查对象是否为null,如果为null,需要一个默认值等等这样的场景。显然,代码重复是坏味道,怎么消除这个坏味道呢?答案就是使用NullObject替代之,Null Object继承原对象。
class NullProject
extends Project{
public boolean isNull(){
return true;
}
}
class Project{
private double cost;
private String projectId;
.
public boolean isNull(){
return false;
}
}
public boolean isNull(){
return true;
}
}
class Project{
private double cost;
private String projectId;
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
public boolean isNull(){
return false;
}
}
那么,原来的代码可以改写为:
if(prj.isNull())
plan.setCost(0.0);
else
plan.setCost(prj.getCost());
plan.setCost(0.0);
else
plan.setCost(prj.getCost());
如果Null Object的引入仅仅是带来这个好处,似乎没有理由让我们多敲这么多键盘。问题的关键是类似上面这样的判断也许出现在很多处,那么有价值的技巧出现了,我们在NullObject覆写getCost,提供缺省值:
class NullProject
extends Project{
public boolean isNull(){
return true;
}
public double getCost(){
return 0.0;
}
}
因此,检查对象是否为null的代码可以去掉if...else了:
public boolean isNull(){
return true;
}
public double getCost(){
return 0.0;
}
}
plan.setCost(prj.getCost());
请注意,只有那些大多数客户端代码都要求null object做出相同响应时,这样的行为才有意义。比如我们这里当工程id为null,很多地方要求费用就默认为0.0。 特殊的行为我们仍然使用isNull进行判断。
当然,另外在需要返回NullObject的地方,你应该创建一个null object以替代一般的对象,我们可以建立一个工厂方法:
class Project{
private double cost;
private String projectId;
.
public boolean isNull(){
return false;
}
public Project createNullProject(){
return new NullProject();
}
}
private double cost;
private String projectId;
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
public boolean isNull(){
return false;
}
public Project createNullProject(){
return new NullProject();
}
}
Null Object模式带来的好处:减少了检查对象是否为null的代码重复,提高了代码的可读性,通常这些Null Object也可以为单元测试带来简便。