有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用空对象模式消除空对象

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


共 (2) 个答案

  1. # 1 楼答案

    你可以使用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);
        }
    }
    
  2. # 2 楼答案

    在语义上合理的情况下,使用接口的“不做任何事情”实现是对模式的良好使用。问题是,什么时候这样做有语义意义

    我使用的关键问题是:“我是在模拟0-1关系还是1-1关系?”。在第一种情况下,使用Optional来传达这一事实让开发人员非常清楚,并帮助我们获得编译时支持。如果我们对1-1关系进行建模,在某些情况下,我们真正的意思是“什么都不做”,那么通过Liskov substitution principle的“什么都不做”实现是一个非常优雅的解决方案

    要讨论数据建模中的基数,请阅读以下书籍片段:Cardinality。简而言之,基数是两个事物之间的关系所能代表的事物的数量。例如,在为汽车建模时;我们预计它会有多少个引擎?0-1意味着一辆车可以有零个或一个发动机,1-1意味着一辆车必须只有一个发动机,0-many意味着这辆车可以有0,1,2,3,4。。。引擎