InvalidationListener vs. ChangeListener

Tengo el caso de uso, donde quiero enlazar múltiplesObservableValues en oneObservable, como en realidad no estoy interesado, cuál es el cambio de valor, solo necesito un medio para recibir una notificación cuando cambie.

Así que este es el enlace Observable, se me ocurrió:

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;
    }
};

Y luego este código de prueba, para verificar que funciona como se esperaba:

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());

Resulta que no. El invalidationCounter solo se incrementa una vez en la primera llamada de invalidación.

Sin embargo, cuando manejo el BooleanBinding desde arriba comoObservableValue, Puedo agregar un 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());

Esto funciona como se esperaba.

Lo que me gustaría saber / he confirmado: InvalidationListener solo se llama una vez, cuando elObservable se vuelve inválido, luego no vuelve a ser válido, por lo que podría volver a ser válido nuevamente. Con unChangeListener sin embargo, se obliga a calcular el nuevo valor, de ahí queObservableValue vuelve a ser válido.

e acuerdo con esta observación, ¿hay algún caso de uso en el que realmente pueda usar unObservable?

Respuestas a la pregunta(1)

Su respuesta a la pregunta