Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX:绑定和弱侦听器_Java_Javafx - Fatal编程技术网

JavaFX:绑定和弱侦听器

JavaFX:绑定和弱侦听器,java,javafx,Java,Javafx,发件人: 注意,JavaFX通过弱函数实现了所有绑定调用 听众。这意味着可以对绑定属性进行垃圾收集并 已停止更新 现在考虑我有两个属性 ObjtType短命驻留在 StimeLoad Obj/和 ObjtType Objor属性> 驻留在 LongLivedObject < /代码> ./P> 我是这样捆绑他们的: longLivedObject.longLivedProperty().bind(shortLivedObject.shortLivedProperty()); 因为绑定使用弱侦听

发件人:

注意,JavaFX通过弱函数实现了所有绑定调用 听众。这意味着可以对绑定属性进行垃圾收集并 已停止更新

现在考虑我有两个属性<代码> 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
的强引用