Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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_Android - Fatal编程技术网

Java 实现回调的两种方法有什么区别

Java 实现回调的两种方法有什么区别,java,android,Java,Android,我有一个类,它有一个名为connect(par1,par2,par3),par3是一个接口/listenr 要提供par3,我可以执行以下操作: connect(par1, par2, asynchCallBack2 ); private class asynchCallBack2 implements MqttCallback { ... ... } 或: 在这两种情况下,一切都很好。那么,不同之处是什么?在哪些场景中使用了每个实现?在一种情况下(即,在您说实现的地方),您定义的是完整的方法

我有一个类,它有一个名为
connect(par1,par2,par3)
par3
是一个
接口/listenr

要提供
par3
,我可以执行以下操作:

connect(par1, par2, asynchCallBack2 );
private class asynchCallBack2 implements MqttCallback {
...
...
}
或:

在这两种情况下,一切都很好。那么,不同之处是什么?在哪些场景中使用了每个实现?

在一种情况下(即,在您说实现的地方),您定义的是完整的方法本地类

而对于另一个,您定义的匿名类类似于您所说的实现的匿名类。只是您没有定义名称并说like实现了myinterface,这对编译器来说是隐式的


这只是您定义类的方式,功能方面没有任何变化。

区别在于需求和处理异常情况,希望这段伪代码能帮您澄清

   interface Engine{
    public void start();
}

private class FerrariEngine implements Engine{
    public void preStartRoutine(){}
    public void Start(){}
}

private class Main{

    private void main(){
        Engine engine=getEngine();
        if(engine instanceOf FerrariEngine){
            ((FerrariEngine)engine).preStartRoutine();
        }
        engine.start();
    }

    private Engine getEngine(){


        if(System==Generic)
        return new Engine{
            @override
            public void start(){
                //Do start
            }
        }
        else if(System==Ferrari)
        return new FerrariEngine();

    }
}
作为一般原则,如果您需要更多的功能,同时仍然能够坚持旧版本,那么创建该类的扩展版本的实例而不是创建匿名实例是有意义的。

请参见此
   interface Engine{
    public void start();
}

private class FerrariEngine implements Engine{
    public void preStartRoutine(){}
    public void Start(){}
}

private class Main{

    private void main(){
        Engine engine=getEngine();
        if(engine instanceOf FerrariEngine){
            ((FerrariEngine)engine).preStartRoutine();
        }
        engine.start();
    }

    private Engine getEngine(){


        if(System==Generic)
        return new Engine{
            @override
            public void start(){
                //Do start
            }
        }
        else if(System==Ferrari)
        return new FerrariEngine();

    }
}