Class DuplexingObservableValue<T>

Type Parameters:
T - the type of value being observed
All Implemented Interfaces:
IObservable, IObservableValue<T>

public abstract class DuplexingObservableValue<T> extends AbstractObservableValue<T>
A class to reduce an observable list to a single value in an implementation specific way.

A concrete implementation must implement coalesceElements(Collection) to specify how the current state of the observed list is reduced to a single value.

For example the default implementation in withDefaults(IObservableList, Object, Object) will return a predefined empty value in case the observed list is empty, an predefined multi value if the list contains multiple different values and the list value if it is the only value or all list values are equal.

Since:
1.2
  • Constructor Details

    • DuplexingObservableValue

      public DuplexingObservableValue(IObservableList<T> target)
      Parameters:
      target - the observed target list
    • DuplexingObservableValue

      public DuplexingObservableValue(IObservableList<T> target, Object valueType)
      Parameters:
      target - the observed target list
      valueType - the value type or null
  • Method Details

    • withDefaults

      public static <T> DuplexingObservableValue<T> withDefaults(IObservableList<T> target, T emptyValue, T multiValue)
      Returns a DuplexingObservableValue implementation with predefined values to use if the list is empty or contains multiple different values.
      Type Parameters:
      T - the type of value being observed
      Parameters:
      target - the observable list
      emptyValue - the value to use when the target list is empty
      multiValue - the value to use when the target list contains multiple values that are not equivalent to each other.
      Returns:
      a DuplexingObservableValue implementation with predefined values to use if the list is empty or contains multiple different values.
    • firstListenerAdded

      protected void firstListenerAdded()
    • lastListenerRemoved

      protected void lastListenerRemoved()
    • makeDirty

      protected final void makeDirty()
    • isStale

      public boolean isStale()
      Description copied from interface: IObservable
      Returns whether the state of this observable is stale and is expected to change soon. A non-stale observable that becomes stale will notify its stale listeners. A stale object that becomes non-stale does so by changing its state and notifying its change listeners, it does not notify its stale listeners about becoming non-stale. Clients that do not expect asynchronous changes may ignore staleness of observable objects.
      Specified by:
      isStale in interface IObservable
      Overrides:
      isStale in class AbstractObservableValue<T>
      Returns:
      true if this observable's state is stale and will change soon.
    • doGetValue

      protected T doGetValue()
      Specified by:
      doGetValue in class AbstractObservableValue<T>
    • coalesceElements

      protected abstract T coalesceElements(Collection<T> elements)
      Called when the current value of this class is requested. The implementation must calculate a single value which should represent the given elements.
      Parameters:
      elements - the collection of elements to be coalesced
      Returns:
      the value representing the elements
    • doSetValue

      protected void doSetValue(T value)
      Description copied from class: AbstractObservableValue
      Template method for setting the value of the observable. By default the method throws an UnsupportedOperationException.
      Overrides:
      doSetValue in class AbstractObservableValue<T>
      Parameters:
      value - the value to set
    • getValueType

      public Object getValueType()
      Description copied from interface: IObservableValue
      The value type of this observable value, or null if this observable value is untyped.
      Returns:
      the value type, or null
    • addChangeListener

      public void addChangeListener(IChangeListener listener)
      Description copied from interface: IObservable
      Adds the given change listener to the list of change listeners. Change listeners are notified about changes of the state of this observable in a generic way, without specifying the change that happened. To get the changed state, a change listener needs to query for the current state of this observable.
      Specified by:
      addChangeListener in interface IObservable
      Overrides:
      addChangeListener in class AbstractObservable
      Parameters:
      listener - the listener to add; not null
    • addValueChangeListener

      public void addValueChangeListener(IValueChangeListener<? super T> listener)
      Specified by:
      addValueChangeListener in interface IObservableValue<T>
      Overrides:
      addValueChangeListener in class AbstractObservableValue<T>
      Parameters:
      listener - the change listener to add; not null
    • dispose

      public void dispose()
      Description copied from interface: IObservable
      Disposes of this observable object, removing all listeners registered with this object, and all listeners this object might have registered on other objects.
      Specified by:
      dispose in interface IObservable
      Overrides:
      dispose in class AbstractObservable
    • addListener

      protected void addListener(Object listenerType, IObservablesListener listener)
      Parameters:
      listenerType - arbitrary object to identify a type of the listener
      listener - the listener to add; not null
    • removeListener

      protected void removeListener(Object listenerType, IObservablesListener listener)
      Parameters:
      listenerType - arbitrary object to identify a type of the listener
      listener - the listener to remove; not null
    • hasListeners

      protected boolean hasListeners()
    • fireEvent

      protected void fireEvent(ObservableEvent event)
    • getRealm

      public Realm getRealm()
      Returns:
      Returns the realm.
    • clone

      protected Object clone() throws CloneNotSupportedException
      Overrides:
      clone in class Object
      Throws:
      CloneNotSupportedException