I like this idea.
   Pretty sure some listener I wrote won't handle a permutation correctly.

   I may have one question: Is there something that needs to be done in
   case of an update (wasUpdated)?

   -- Marius

   Gesendet: Mittwoch, 20. Oktober 2021 um 21:07 Uhr
   Von: "Michael Strau�" <michaelstr...@gmail.com>
   An: "openjfx-dev@openjdk.java.net List" <openjfx-dev@openjdk.java.net>
   Betreff: Easier handling of ObservableList/Set/Map change events
   I'd like to gauge interest on a small feature addition for JavaFX
   collections.
   ObservableList (and similarly, ObservableSet/ObservableMap) allows
   developers to register ListChangeListeners to observe changes to the
   list. In some cases, these changes are applied to another list or
   projected into a different form.
   Implementing ListChangeListener correctly is quite tricky, especially
   if the ObservableList implementation also fires "replace" and
   "permutate" events. As a result, it is very easy to implement this
   interface wrongly, which often goes undetected when the implementation
   is only tested against basic operations like "add" and "remove".
   Maybe we could make it easier for developers to get it right more of
   the time, by offering pre-built adapters for ListChangeListener,
   SetChangeListener and MapChangeListener.
   Here's what that could look like:
   public abstract class ListChangeListenerAdapter<E> implements
   ListChangeListener<E> {
   // Basic methods
   public abstract void onAdded(int index, E element);
   public abstract void onRemoved(int index);
   // Optional methods
   public void onAdded(int index, List<? extends E> elements);
   public void onRemoved(int from, int to);
   public void onReplaced(int index, E element);
   public void onUpdated(int index, E element);
   }
   An implementation of this adapter must at the very least implement the
   basic `onAdded` and `onRemoved` methods. The adapter will then
   correctly map all other change events ("replace" and "permutate") to
   these methods. All adapter methods will always be called in exactly
   the right order, such that they always refer to the current state of
   the list.
   An adapter implementation can improve performance characteristics by
   overriding the optional `onAdded`, `onRemoved` and `onReplaced`
   methods (which map to `addAll`, `remove` and `set` of the List
   interface). Optional methods are implemented by default to throw a
   private exception in ListChangeListenerAdapter, which is used to
   discover whether the methods are overridden and should be called
   instead of the basic methods.

Reply via email to