代码之家  ›  专栏  ›  技术社区  ›  JKostikiadis

StringProperty上的意外垃圾收集[duplicate]

  •  1
  • JKostikiadis  · 技术社区  · 6 年前

    我有一个用例,我想绑定多个 ObservableValue 这是一个 Observable ,因为我实际上不感兴趣,价值的变化是什么,我只需要一种方法在它变化时得到通知。

    这就是可观察的束缚,我想到:

    BooleanBinding() {
        {
            super.bind(proxy.activeShipProperty());
            INavigableVessel activeShip = proxy.getActiveShip();
            super.bind(activeShip.getLoadBinding());
            if (activeShip instanceof IShip) {
                super.bind(((IShip) activeShip).travelState());
            } else {
                super.bind(((IConvoy) activeShip).getOrlegShip().travelState());
            }
            super.bind(date.dayDateBinding());
        }
        private boolean value = true;
        @Override
        protected boolean computeValue() {
            value = !value;
            return value;
        }
    };
    

    然后是这个测试代码,以验证它是否按预期工作:

    Observable observable = contentProvider.createObservable(ENoticeBoardType.SHIP_WARE_INFO, proxy);
    IntegerProperty invalidationCounter = new SimpleIntegerProperty(0);
    
    InvalidationListener listener = observable1 -> invalidationCounter.setValue(invalidationCounter.get() + 1);
    observable.addListener(listener);
    
    // When
    dayBinding.invalidate();
    loadBinding.invalidate();
    travelState.set(EShipTravelState.ANCHOR);
    activeVessel.set(mock(IShip.class));
    
    // Then
    assertEquals(4, invalidationCounter.get());
    

    事实证明并非如此。第一次调用invalidate时,InvalidateCounter只增加一次。

    但是当我从上面处理布尔绑定时 可观察值 ,我可以添加一个ChangeListener:

    ChangeListener listener = (obs, oldValue, newValue) -> invalidationCounter.setValue(invalidationCounter.get() + 1);
    observable.addListener(listener);
    
    // When
    dayBinding.invalidate();
    loadBinding.invalidate();
    travelState.set(EShipTravelState.ANCHOR);
    activeVessel.set(mock(IShip.class));
    
    // Then
    assertEquals(4, invalidationCounter.get());
    

    这是意料之中的事。

    我想知道/确认的是:当 可见的 变为无效后,它不会变回有效状态,因此可以再次变为有效状态。用一个 ChangeListener 但是,新值必须计算,因此 可观察值 重新生效。

    根据这一观察,是否有任何用例我可以使用 Observable ?

    0 回复  |  直到 6 年前