小编Gen*_*rog的帖子

Java方法参考实例化

我正在尝试构建一个库,您可以在其中添加和删除pub/sub系统中的事件的侦听器,但是使用方法引用遇到问题:

// here, this::printMessage is being passed as an instance of Consumer<String>
pubSub.subscribe(this::printMessage);
pubSub.unsubscribe(this::printMessage);
Run Code Online (Sandbox Code Playgroud)

在内部,调用subscribe()会将实例添加Consumer<T>到a Set<Consumer<T>>,unsubscribe()并将其删除.这个问题源于this::printMessage这里的每次使用实际上都会导致编译器生成一个新的对象引用/实例,因此,取消订阅实际上并不起作用.

到目前为止,我管理的解决方法是:

final Consumer<String> consumer = this::printMessage;
pubSub.subscribe(consumer);
pubSub.unsubscribe(consumer);
Run Code Online (Sandbox Code Playgroud)

但是,这并不是很理想.我担心的是,使用这个库的经验较少的人可能会认为他们可以在订阅/取消订阅时直接使用方法引用,但实际情况并非如此,最坏的情况是导致内存泄漏.

所以问题是,是否有一些聪明的方法来避免这种情况或强制方法引用总是解析为同一个对象引用/实例?

java method-reference

6
推荐指数
1
解决办法
122
查看次数

标签 统计

java ×1

method-reference ×1