JavaFX:绑定和弱侦听器
发件人: 注意,JavaFX通过弱函数实现了所有绑定调用 听众。这意味着可以对绑定属性进行垃圾收集并 已停止更新JavaFX:绑定和弱侦听器,java,javafx,Java,Javafx,发件人: 注意,JavaFX通过弱函数实现了所有绑定调用 听众。这意味着可以对绑定属性进行垃圾收集并 已停止更新 现在考虑我有两个属性 ObjtType短命驻留在 StimeLoad Obj/和 ObjtType Objor属性> 驻留在 LongLivedObject < /代码> ./P> 我是这样捆绑他们的: longLivedObject.longLivedProperty().bind(shortLivedObject.shortLivedProperty()); 因为绑定使用弱侦听
现在考虑我有两个属性<代码> ObjtType短命驻留在<代码> StimeLoad Obj/<代码>和<代码> ObjtType Objor属性> <代码>驻留在<代码> LongLivedObject < /代码> ./P> 我是这样捆绑他们的:
longLivedObject.longLivedProperty().bind(shortLivedObject.shortLivedProperty());
因为绑定使用弱侦听器,所以如果shortLivedObject
被垃圾收集,那么shortLived
属性也将被垃圾收集。那么,这是否意味着longlife
属性仍然是绑定的,但它永远不会被更新?这是否会使长寿命
属性处于绑定状态(使进一步绑定不可能),但什么也不做
那么,这是否意味着长寿财产仍然受到约束,但
永远不会更新吗
假设shortLivedProperty
已被垃圾收集,则shortLivedProperty
将永远不会再次失效。因此,longlife
的侦听器将永远不会被调用和更新
这是否会使长寿命财产处于约束状态(进一步
绑定不可能),但什么都不做
无论绑定状态如何,您都应该能够将属性绑定到新的可观察属性,因为旧的可观察属性将被删除/解除绑定:
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();
}
}
公共无效绑定(最终观察值我认为JavaDoc所说的是,longLivedProperty
(用于侦听shortLivedObject的更改)的侦听器可能会在使用WeakReference
时被垃圾收集,对吧?。除非您对longLivedProperty
有强烈的引用,这将阻止其侦听因此,JavaDoc并没有说shortLivedProperty
将被垃圾收集。那么你为什么期望shortLivedProperty
被垃圾收集呢?我在查找源代码时发现了一些有趣的东西。如果this.observable
是current属性正在侦听更改,那么当前属性是否会保留另一个属性的强引用?因此,它们使侦听器变弱,但保持另一个属性的强引用…这就是为什么我问您“为什么希望shortLivedProperty
被垃圾收集”?据我所知,这不应该发生,因为shortLivedProperty至少可以从您描述的longLivedProperty
强烈访问。好吧,Javadoc说:这意味着绑定属性可以被垃圾收集
。在看到源代码后,这一说法证明是一个公然的谎言。绑定属性r关于longLivedProperty
,因为longLivedProperty
绑定到shortLivedProperty
。事实上,longLivedProperty
如果弱可及性,可能会被垃圾收集。也就是说,如果您没有对longLivedProperty
的强引用