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对象(单例),而不是返回NULL。这消除了我的代码中的NULL检查,从而由于这种情况而删除了分支。
这是使用NULL对象模式的正确位置还是应该使用NULL方法?
答案 0 :(得分:1)
使用接口的“不执行任何操作”实现在语义上有意义时可以很好地使用该模式。问题是,什么时候这样做才有意义?
我使用的关键问题是:“我是在模拟0-1关系还是1-1关系”。在第一种情况下,然后使用Optional传达事实,这对于开发人员来说非常清楚,并有助于我们提供编译时间支持。如果我们正在建立1-1关系的模型,并且在某些情况下确实意味着“不做任何事情”,那么通过Liskov substitution principle的“不做任何事情”实现是一个非常优雅的解决方案。
要讨论数据建模中的基数,请阅读以下书摘:Cardinality。简而言之,基数是两个事物之间的关系可以表示的事物的数量。例如,在为汽车建模时;我们希望它有多少个引擎? 0-1表示一辆汽车可以具有零个或一个引擎,1-1表示一辆汽车必须恰好具有一个引擎,0表示许多汽车意味着可以有0、1、2、3、4 .. 。 引擎。
答案 1 :(得分:0)
您可以使用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);
}
}