Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用NULL对象模式消除NULL_Java_Design Patterns_Null Object Pattern - Fatal编程技术网

Java 使用NULL对象模式消除NULL

Java 使用NULL对象模式消除NULL,java,design-patterns,null-object-pattern,Java,Design Patterns,Null Object Pattern,在上面的代码中,我创建了一个DummyChild类,这样每当调用getObj()获取正确的类对象时,我都会返回dummyClass对象(singleton),而不是返回NULL。这消除了代码中的空检查,从而消除了由于这种情况而产生的分支 这是使用空对象模式的正确位置还是我应该使用空方法?您可以使用可选而不是重新发明轮子: interface Parent{ void process(); } class Child1 implements Parent{ void proces

在上面的代码中,我创建了一个DummyChild类,这样每当调用getObj()获取正确的类对象时,我都会返回dummyClass对象(singleton),而不是返回NULL。这消除了代码中的空检查,从而消除了由于这种情况而产生的分支


这是使用空对象模式的正确位置还是我应该使用空方法?

您可以使用
可选
而不是重新发明轮子:

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();
    }
}
D类{
可选的getObj(){
如果(条件1){
返回可选的.of(new Child1());
}
如果(条件2){
返回可选的.of(new Child2());
}
否则{
返回可选的.empty();
}
}
公共静态void main(字符串[]args){
可选的obj=newd().getObj();
对象ifPresent(父对象::进程);
}
}

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

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


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

使用
java.util.Optional
。通常是的,这是空的设计模式。虽然它是有效的,但编写糟糕的代码仍然会导致
NullPointerException
——此设计模式不会阻止任何人传入
null
引用。对于健壮的解决方案,请按照建议使用
Optional
。有利有弊。但是我们把这个问题变成了一个比被问到时更基于观点的问题。我完全同意使用
Optional
,但我想说的是,在尝试调用方法时,用
Optional
包装值比用“提供者”返回
Optional
更直观。只是一个意见。谢谢上面的代码,但我有一个疑问。假设我必须根据对象是否为null调用多个函数。如果您编写了obj.ifPresent(Parent::process),而不是编写if(NULL!=obj),这并不能使我的代码变得干净,如果调用多个函数,我必须编写类似obj.ifPresent(Parent::someotherinterfacefunction)的代码。然而,在我上面的代码中,所有这些检查都被删除了。那么你对此有什么建议?@Jai这是一个权衡。如果您正在调用从多个位置返回可能为null的实例的方法,那么每次都用可选的方法包装它可能会很烦人。另一方面,更改多个这样的方法以返回可选方法可能同样令人讨厌。@P3A根据具体场景,您可以使用各种可选方法(orElse、orElseThrow等)。谢谢。我们这里所说的0-1和1-1关系是什么意思;我认为这是一种知识。从阅读开始,我还会在答案中添加更多细节。
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);
    }
}