InvalidationListener vs. ChangeListener
Eu tenho o caso de uso, onde eu quero ligar váriosObservableValue
s 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
?