使用方法引用运算符(::)时如何移除剪贴板管理器的监听器?
Java方法引用添加的监听器如何移除
直接用this::doSomething执行移除操作是行不通的。因为每次调用方法引用表达式,JVM都会生成一个全新的监听器实例——你添加时传入的对象,和移除时传入的根本不是同一个实例,所以移除操作不会生效。
正确的处理方式是提前把方法引用转换为对应的监听器对象并保存引用,后续移除时直接使用这个保存好的实例:
// 将方法引用转换为监听器实例并保存 PrimaryClipChangedListener myClipListener = this::doSomething; // 添加监听器 this.clipboardManager.addPrimaryClipChangedListener(myClipListener); // 需要移除时,使用保存的引用 this.clipboardManager.removePrimaryClipChangedListener(myClipListener);
本质原因在于:方法引用(包括lambda表达式)编译后会生成匿名内部类实例,但Java并未规定同一个方法引用表达式多次调用必须返回同一个实例。所以绝对不能依赖“两次方法引用生成同一个对象”这种未定义行为,必须显式持有监听器的引用才能完成正确的移除操作。
内容的提问来源于stack exchange,提问作者zaxunobi
相关产品推荐
相关产品推荐

