Interface Observer<T>

Type Parameters:
T - the type of data propagated to listeners
All Known Subinterfaces:
CalendarPanel.CalendarDate, CalendarPanel.CalendarDateTime, CalendarPanel.CalendarZonedDateTime, ComponentValue<C,T>, EntityConditionModel.ConditionValue, EntityConditionModel.Modified, EntityEditModel.EditEvents.Deleted, EntityEditModel.EditEvents.Inserted, EntityEditModel.EditEvents.Updated, EntityEditModel.EditorValue<T>, EntityEditModel.EntityEditor, EntityEditModel.EntityEditor.Exists, EntityEditModel.EntityEditor.Modified, Event<T>, FilterModel.FilteredItems<T>, FilterModel.IncludedItems<T>, FilterModel.IncludePredicate<T>, FilterTableColumnModel.ColumnSelection.ColumnIndex, FilterTableColumnModel.HiddenColumns<C>, FilterTableColumnModel.VisibleColumns<C>, FilterTableSearchModel.Results, ImagePane.ImageValue, MultiSelection.Indexes, MultiSelection.Items<R>, Observable<T>, ObservableState, ObservableValueCollection<T,C>, ObservableValueList<T>, ObservableValueSet<T>, State, Value<T>, ValueCollection<T,C>, ValueList<T>, ValueSet<T>
All Known Implementing Classes:
AbstractComponentValue, AbstractObserver, AbstractTextComponentValue, AbstractValue, PropertyValue

public interface Observer<T>
Manages listeners and consumers for observable values and events.

This interface provides default method implementations that delegate to observer(). There are two ways to implement this interface:

  • Extend AbstractObserver - provides concrete implementations where observer() returns this
  • Implement observer() to return a delegate - useful for wrapper types (see Observable for an example)

All implementations are thread-safe and support concurrent access.

See Also:
  • Method Details

    • addListener

      default boolean addListener(Runnable listener)
      Adds listener to this Observer. Adding the same listener a second time has no effect.
      Parameters:
      listener - the listener to add
      Returns:
      true if this observer did not already contain the specified listener
      Throws:
      NullPointerException - in case listener is null
    • removeListener

      default boolean removeListener(Runnable listener)
      Removes listener from this Observer
      Parameters:
      listener - the listener to remove
      Returns:
      true if this observer contained the specified listener
    • addConsumer

      default boolean addConsumer(Consumer<? super T> consumer)
      Adds consumer to this Observer. Adding the same consumer a second time has no effect.
      Parameters:
      consumer - the consumer to add
      Returns:
      true if this observer did not already contain the specified consumer
      Throws:
      NullPointerException - in case consumer is null
    • removeConsumer

      default boolean removeConsumer(Consumer<? super T> consumer)
      Removes consumer from this Observer
      Parameters:
      consumer - the consumer to remove
      Returns:
      true if this observer contained the specified consumer
    • addWeakListener

      default boolean addWeakListener(Runnable listener)
      Uses a WeakReference, adding listener does not prevent it from being garbage collected. Adding the same listener a second time has no effect.

      Note: Dead weak references accumulate until cleaned up, which happens automatically when listeners are added or removed. To trigger cleanup manually without modifying the listener set, call removeWeakListener(Runnable) with any non-existing listener:

       // Clean up dead weak references
       observer.removeWeakListener(() -> {});
      
      Parameters:
      listener - the listener
      Returns:
      true if this observer did not already contain the specified listener
    • removeWeakListener

      default boolean removeWeakListener(Runnable listener)
      Removes listener from this Observer
      Parameters:
      listener - the listener to remove
      Returns:
      true if this observer contained the specified listener
    • addWeakConsumer

      default boolean addWeakConsumer(Consumer<? super T> consumer)
      Uses a WeakReference, adding consumer does not prevent it from being garbage collected. Adding the same consumer a second time has no effect.

      Note: Dead weak references accumulate until cleaned up, which happens automatically when listeners are added or removed. To trigger cleanup manually without modifying the listener set, call removeWeakConsumer(Consumer) with any non-existing consumer:

       // Clean up dead weak references
       observer.removeWeakConsumer(data -> {});
      
      Parameters:
      consumer - the consumer
      Returns:
      true if this observer did not already contain the specified consumer
    • removeWeakConsumer

      default boolean removeWeakConsumer(Consumer<? super T> consumer)
      Removes consumer from this Observer.
      Parameters:
      consumer - the consumer to remove
      Returns:
      true if this observer contained the specified consumer
    • when

      default Observer<T> when(@Nullable T value)
      Returns a new conditional Observer notified when this observer instance is triggered with the given value
      Parameters:
      value - the value on which to trigger the observer
      Returns:
      a new conditional Observer
    • when

      default Observer<T> when(Predicate<? super T> predicate)
      Returns a new conditional Observer notified when this observer instance is triggered with a value satisfying the given predicate
      Parameters:
      predicate - the predicate on which to trigger the observer
      Returns:
      a new conditional Observer
    • observer

      Observer<T> observer()
      Returns the underlying Observer to which listener operations are delegated.

      For AbstractObserver subclasses this method returns this. For wrapper types, this returns the delegate observer.

      Returns:
      the Observer handling listener management