通过使用NULL对象模式消除NULL

时间:2018-07-11 09:22:20

标签: java design-patterns null-object-pattern

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方法?

2 个答案:

答案 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);
    }
}