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/