【发布时间】:2015-06-26 21:07:21
【问题描述】:
我想将 JavaFX ListChangeListener 注册到 ObservableList。但是我注意到,在某些情况下,Listener 没有被调用。
(1) 如果 Listener 是方法引用,则一切正常:
// using a direct method reference:
private final ListChangeListener<String> listener = this::listDidChange;
/* ... */
public void init() {
list.addListener(listener);
}
(2) 但是,如果监听器是同一方法的弱引用,则不会调用监听器:
// using a weak method reference:
private final ListChangeListener<String> listener = new WeakListChangeListener<String>(this::listDidChange);
/* ... */
public void init() {
list.addListener(listener);
}
(3) 现在真正有趣的部分是,它再次起作用了,尽管它应该与前面的示例相同:
// direct method reference wrapped into a weak ref later:
private final ListChangeListener<String> listener = this::listDidChange;
/* ... */
public void init() {
list.addListener(new WeakListChangeListener<String>(listener));
}
两个问题:
- 当创建方法 ref 的弱 ref 时,究竟会发生什么?
- (2)和(3)有什么区别?
【问题讨论】:
-
根据 WeakListChangeListener 的 JavaDoc:“注意:您必须保留对 ListChangeListener 的引用,只要它在使用中就已传入,否则很快就会被垃圾收集。”
标签: java lambda javafx weak-references