On Tue, 22 Sep 2026 00:04:33 GMT, Michael Strauß <[email protected]> wrote:

>> John Hendrikx has updated the pull request incrementally with one additional 
>> commit since the last revision:
>> 
>>   Implement notifying boolean
>
> modules/javafx.base/src/main/java/javafx/beans/value/ObservableListValue.java 
> line 36:
> 
>> 34:  * {@link ObservableValue}. A {@code ChangeListener} registered on an
>> 35:  * {@code ObservableListValue} is notified when the contents of the list 
>> change
>> 36:  * as well as when the list reference is replaced. When the contents 
>> change, the
> 
> I think that invoking a change listener when only the _contents_ of a list 
> has changed is a jarring defect. A change listener should only be invoked 
> when the list instance is changed; for its contents, we have 
> `ListChangeListener`. Now, I'm not sure if we can ever fix this, but maybe we 
> shouldn't enshrine this defect into specification with this PR. If we come to 
> the conclusion that it can't be changed, we can always specify this behavior 
> later.

Hm, yeah, I doubt we'll ever be able to change it, and I would recommend 
deprecating them completely. But since this was already a bit out of scope for 
this PR, I can just leave this change out.

A closer (unrelated) investigation also turned up that any kind of nested 
change on an `ObservableList` will break the `Change` you receive, even if you 
trigger that nested change from an invalidation or change listener (ie. before 
`ListChangeListener`s are called).

So I think I would also recommend throwing a `ConcurrentModificationException` 
in those cases, because the `Change` you receive in a nested scenario will just 
be incorrect, lead to perhaps `IndexOutOfBoundsException`s or worse still, 
silent corruption as you process the outdated `Change`.

I was checking this to see if it would at some point be useful to have 
`ListenerManager` support the collection observables, but the whole nested 
change part won't apply for those as it is disallowed (hidden on 
`ListChangeListener` but applies to all types of listeners for the collection 
observables):


     * <b>Warning:</b> This class directly accesses the source list to acquire 
information about the changes.
     * <br> This effectively makes the Change object invalid when another 
change occurs on the list.
     * <br> For this reason it is <b>not safe to use this class on a different 
thread</b>.
     * <br> It also means <b>the source list cannot be modified inside the 
listener</b> since that would invalidate this Change object
     * for all subsequent listeners.


The "inside the listener" should really be "inside any listener on this 
observable"...

-------------

PR Review Comment: https://git.openjdk.org/jfx/pull/1081#discussion_r4112159755

Reply via email to