interface Parent{
void process();
}
class Child1 implements Parent{
void process(){
//process by method 1
}
}
class Child2 implements Parent{
void process(){
//process by method 2
}
}
class DummyChild implements Parent{
void process(){
//do nothing
}
}
class D {
Parent getObj(){
if(condition1){
return new Child1();
}
else if(condition2){
return new Child2();
}
else
return new DummyChild();
}
public static void main(String[] args){
Parent obj = getObj();
obj.process();
}
}
在上面的代码中,我创建了一个DummyChild类,这样无论何时调用getObj((来获取正确的类对象,我都会返回dummyClass对象(singleton(,而不是返回NULL。这消除了代码中的NULL检查,从而消除了由于这种情况而产生的分支。
这是使用NULL对象模式的正确位置吗?还是应该使用NULL方法?
在语义上有意义的情况下,使用接口的"什么都不做"实现是对模式的良好利用。问题是,什么时候这样做才有语义意义?
我使用的关键问题是:"我是在模拟0-1的关系还是1-1的关系"。在第一种情况下,使用Optional来传达这一事实会让开发人员非常清楚,并帮助我们提供编译时支持。如果我们正在为1-1关系建模,并且在某些情况下我们的意思是"什么都不做",那么通过Liskov替代原理的"什么都不要做"实现是一个非常优雅的解决方案。
要讨论数据建模中的基数,请阅读以下书籍片段:基数。简而言之,基数是两个事物之间的关系可以表示的事物的数量。例如,在为汽车建模时;我们预计它会有多少台发动机?0-1意味着一辆车可以有零个或一个发动机,1-1意味着一部车必须只有一个发动机。0-many意味着这辆车可以拥有0、1、2、3、4。。。发动机。
您可以使用Optional
而不是重新发明轮子:
class D {
Optional<Parent> getObj(){
if(condition1){
return Optional.of(new Child1());
}
else if(condition2){
return Optional.of(new Child2());
}
else {
return Optional.empty();
}
}
public static void main(String[] args){
Optional<Parent> obj = new D().getObj();
obj.ifPresent(Parent::process);
}
}