JavaFX: Binding and weak listener
来自 bind() 的 Javadoc:
Note that JavaFX has all the bind calls implemented through weak
listeners. This means the bound property can be garbage collected and
stopped from being updated.
现在考虑我有两个属性 ObjectProperty<Foo> shortLived 驻留在 ShortLivedObject 和 ObjectProperty<Foo> longLived 驻留在 LongLivedObject.
我是这样绑定它们的:
1
| longLivedObject.longLivedProperty().bind(shortLivedObject.shortLivedProperty()); |
因为绑定使用弱监听,所以如果 ShortLivedObject 被垃圾回收,shortLived 属性也会被垃圾回收。那么,这是否意味着 longLived 属性仍然被绑定,但它永远不会被更新?这是否使 longLived 属性处于绑定状态(使进一步绑定变得不可能),但什么也不做?
- 我认为 JavaDoc 所说的是 longLivedProperty 的侦听器(用于侦听 shortLivedObject 的更改)可能在使用 WeakReference 时被垃圾收集,对吧?除非您对 longLivedProperty 有一个强引用,这将阻止其侦听器被垃圾收集。因此,JavaDoc 并不是说?? shortLivedProperty 将被垃圾收集。那么你为什么期望 shortLivedProperty 被垃圾回收呢?
So, does that means that longLived property is still bound, but it
will never be updated?
假设 shortLivedProperty 已被垃圾回收,则 shortLivedProperty 将永远不会再次失效。因此,longLived 的侦听器将永远不会被再次调用和更新。
Does that leave longLived property in a bound state (making further
binding impossible), but does nothing?
无论绑定状态如何,您都应该始终能够 bind 将属性添加到新的 observable,因为旧的 observable 属性将为您删除/解除绑定:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public void bind (final ObservableValue <? extends T > newObservable ) {
if (newObservable == null) {
throw new NullPointerException("Cannot bind to null");
}
if (!newObservable. equals(this. observable)) {
unbind ();
observable = newObservable ;
if (listener == null) {
listener = new Listener (this);
}
observable. addListener(listener );
markInvalid ();
}
} |
- 我在寻找源代码时发现了一些有趣的东西。如果 this.observable 是当前属性正在侦听更改的另一个属性,那么当前属性不会持有另一个属性的强引用吗?所以他们让听者变弱,但保持其他属性的参考强......
-
这就是为什么我问你"你为什么期望 shortLivedProperty 被垃圾收集"?据我了解,这不应该发生,因为 shortLivedProperty 至少可以从您描述的 longLivedProperty 强烈访问。
-
好吧,Javadoc 是这样说的:This means the bound property can be garbage collected。看到源代码后,这种说法被证明是一个公然的谎言。
-
由于 longLivedProperty 绑定到 shortLivedProperty,因此绑定属性引用 longLivedProperty。事实上,如果 longLivedProperty 是弱可达的,它可能会被垃圾回收。也就是说,如果您没有对 longLivedProperty 的强引用