Even though it's more of a "philosophical" question maybe you can help me out... :-D

Obviously ChangeListeners and InvalidationListeners are not always executed at the same time when used on a Property.

However, this seems not to be the case for ListChangeListener and InvalidationListeners used on ObservableLists. According to an example in the book "Pro JavaFx 2" it seems as if in this case both listeners are always executed at the same time. The book even states: "Although it is not specified in the Javadocs, for observable lists obtained by calling FXCollections.observableArrayList() a invalidation event is fired exactly when a list change event is fired. Any invalidation listener you add is wrapped and added as a list change listener. You can verify this by stepping
through the code in a debugger."

This is useful to know and wasy to accept (if known), but nevertheless for a better understanding i'd like to know the reason for this behaviour. Without knowing the example above I would have thought that a InvalidationListener is executed if anything "changes" and is not already invalid (similar to the case of a property), that the changeListener is only executed when the changes are "asked for". For example when printing out. For a simple "add" (without using the newly added value) I therefore expected the invalidationListener to be executed, but not the ListChangeListener. Isn't this behaviour kind of inconsistent?