java - 使用监听器: using Anonymous class or implementing listner有哪些更有效的方法

标签 java anonymous-class java-memory-model

class Rocket {

    public Rocket() {}

    public interface RocketListener {
        void RocketLaunched();
    }

    RocketListener listener;
    public void setRocketListener(RocketListener listener) {
        this.listener = listener;
    }

    //When rocket get launched.
    listener.RocketLaunched();
}


//first case : when implementing listner
class MyClass implements RocketListener {

    Rocket rocket = new Rocket();
    rocket.setRocketListener(this);

    @Override
    public void RocketLaunched() {
        //when rockect get launched. it get called
    }
}


//second case : when using anonymous class for listner
class MyClass {

    Rocket rocket = new Rocket();
    rocket.setRocketListener(new RocketListener() {

        @Override
        public void RocketLaunched() {
            //when rockect get launched. it get called
        }
    });
}  

第一种情况:当MyClass实现接口(interface)时,setOnClickListener()中发送的参数是类的实例。
第二种情况: setOnClickListener() 中发送的参数是匿名类。

问题1:在第二种情况下,匿名类是否持有MyClass的引用?
问题 2:在这两种情况下,内存上留下的指纹是什么?
问题 3:哪种情况最好使用,以提高性能还是保留更少的内存?

最佳答案

内部类实例可以访问容器实例内存。如果发生名称冲突,您可以通过 MyClass.this 强制使用容器实例的类名。

答案 1:

答案 2:创建了 2 个类别 ~ 相同的指纹。在第一种情况下,监听器类可以在其他地方重用。

答案3:内部类可以访问容器实例的属性和方法→非常有用,但是当监听器类可以在多个用途之间共享时,它会使用较少的类。最好的方法是分解更多代码的方法。

关于java - 使用监听器: using Anonymous class or implementing listner有哪些更有效的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25952056/

相关文章:

Java - 返回通用基本类型的工厂方法

java - 在 Java 中,this/super 关键字可以表示类/枚举以外的任何东西吗?

java - 调用匿名类的子类方法

java - 我可以在 Android 中使用 POST 方法从 URL 获取数据吗?

java - 保留 Coda Hale 指标信息

java - java中的初始化安全

c++ - 使用已定义的结构作为 union 的匿名成员

java - 在 Java 内存模型中发生在关系之前

java - 并发访问不同步的 Java ArrayList 的影响

java - 了解上下文切换期间的 Java 内存模型