我希望注册一个JavaFX ListChangeListener
到一个 ObservableList
。然而,我注意到在某些情况下,监听器没有被调用。
(1) 如果监听器是一个方法引用,那么一切正常:
// 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));
}
两个问题:
- 创建一个指向方法引用的弱引用时,究竟会发生什么?
- (2)和(3)之间有什么区别?