InvalidationListener vs. ChangeListener

Eu tenho o caso de uso, onde eu quero ligar váriosObservableValues para umObservable, como na verdade não estou interessado em saber qual é a alteração de valor, só preciso de um meio para ser notificado quando ela for alterada.

Então essa é a ligação do Observable, eu vim:

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

E então este código de teste, para verificar se funciona como esperado:

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

Acontece que não. O invalidationCounter é aumentado apenas uma vez na primeira chamada inválida.

No entanto, quando eu manuseio o BooleanBinding de cima comoObservableValue, Posso adicionar um 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());

Isso funciona conforme o esperado.

O que eu gostaria de saber / ter confirmado: O InvalidationListener é chamado apenas uma vez, quando oObservable se torna inválido, ele não volta a ser válido, para que possa se tornar válido novamente. Com umChangeListener no entanto, o novo valor é forçado a ser calculado, daí aObservableValue torna-se válido novamente.

Com base nessa observação, existe algum caso de uso em que eu possa realmente usar umObservable?

questionAnswers(1)

yourAnswerToTheQuestion