Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.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

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方法引用的标准模式_Java_Design Patterns_Standards - Fatal编程技术网

启动和调用Java方法引用的标准模式

启动和调用Java方法引用的标准模式,java,design-patterns,standards,Java,Design Patterns,Standards,我有一个ClassA对象,它在ClassB1和ClassB2对象内部设置方法引用。ClassB1和ClassB2对象稍后将在运行其方法时使用此方法引用。但是,有时我们不设置方法参考: public class ClassA { public ClassA() { ClassB1 objB1 = new ClassB1(); ClassB2 objB2 = new ClassB2(); objB1.setFuncitonA(this::fun

我有一个ClassA对象,它在ClassB1和ClassB2对象内部设置方法引用。ClassB1和ClassB2对象稍后将在运行其方法时使用此方法引用。但是,有时我们不设置方法参考:

public class ClassA {
    public ClassA() {
        ClassB1 objB1 = new ClassB1();
        ClassB2 objB2 = new ClassB2();
        objB1.setFuncitonA(this::functionA);
        objB2.setFuncitonA(this::functionA);
        objB1.functionB();
        objB2.functionB();
    }
    public void functionA(Integer x) {
        x *= 2;
    }
}

public class ClassB1 {
    private Integer intObjB = new Integer(2);
    private Consumer<Integer> functionA = null;
    public void functionB() {
        if(functionA != null) {
            functionA.accept(intObjB);
        }
    }
    public void setFuncitonA(Consumer<Integer> functionA) {
        this.functionA = functionA;
    }
}

public class ClassB2 {
    private Integer intObjB = new Integer(2);
    private Consumer<Integer> functionA = this::defaultFunctionA;
    public void functionB() {
        functionA.accept(intObjB);
    }
    public void setFuncitonA(Consumer<Integer> functionA) {
        this.functionA = functionA;
    }
    public void defaultFunctionA(Integer intObj) {
        return;
    }
}
它应该像在类B1中还是像在类B2中,或者,它有关系吗?编写此类代码的标准模式是什么?

消除if语句始终是首选

此外,消除空变量总是更好


因此,到目前为止,ClassB2方法更好。

这种实现决策有一个术语:懒散地实例化字段,或者急切地实例化字段

ClassB1惰性地实例化函数使用者。这告诉包括您自己在内的维护人员,并非每个新实例都需要此使用者,在某些上下文中,将其设为null是安全的。这确实意味着,当您使用它时,您必须回头看,就像在空检查的情况下一样

ClassB2急切地实例化函数使用者。这会告诉包括您自己在内的维护人员,在实例化时需要此使用者。这意味着您可以避免愚蠢的空检查,如果它确实是您在实例化时知道的东西,在本例中,它是您知道或可以得到的东西

然后,标准模式变为:

如果您愿意在使用前检查字段或变量是否为null,那么可以惰性地实例化该字段。 如果在使用前必须确保字段或变量不为null,那么请急切地实例化该字段。
没有硬性规定可以使用,也没有硬性规定可以选择其中一个。这在很大程度上取决于您的用例。

除非setter中有一个“空检查”或至少被视为不可空。非常感谢Mike的回答,我会接受它,除非我们在最近的时间内在这个线程中有一些可供选择和支持的意见。我将非常感谢如果你给任何参考书或网站上写的。如果你没有,也没关系。谢谢你出色而深入的分析,Makoto。我现在清楚多了。