Class ComputedValue<T>
- java.lang.Object
-
- org.eclipse.core.databinding.observable.AbstractObservable
-
- org.eclipse.core.databinding.observable.value.AbstractObservableValue<T>
-
- org.eclipse.core.databinding.observable.value.ComputedValue<T>
-
- Type Parameters:
T
- the type of value being observed
- All Implemented Interfaces:
IObservable
,IObservableValue<T>
- Direct Known Subclasses:
AggregateValidationStatus
public abstract class ComputedValue<T> extends AbstractObservableValue<T>
A Lazily calculated value that automatically computes and registers listeners on its dependencies as long as all of its dependencies areIObservable
objects. Any change to one of the observable dependencies causes the value to be recomputed.This class is thread safe. All state accessing methods must be invoked from the
current realm
. Methods for adding and removing listeners may be invoked from any thread.Example: compute the sum of all elements in an
IObservableList
<Integer
>.final IObservableList addends = WritableValue.withValueType(Integer.TYPE); addends.add(Integer.valueOf(0)); addends.add(Integer.valueOf(1)); addends.add(Integer.valueOf(2)); IObservableValue sum = new ComputedValue() { protected Object calculate() { int sum = 0; for (Iterator it = addends.iterator(); it.hasNext();) { Integer addend = (Integer) it.next(); sum += addend.intValue(); } return sum; } }; System.out.println(sum.getValue()); // => 3 addends.add(Integer.valueOf(10)); System.out.println(sum.getValue()); // => 13
- Since:
- 1.0
-
-
Constructor Summary
Constructors Constructor Description ComputedValue()
ComputedValue(Object valueType)
ComputedValue(Realm realm)
ComputedValue(Realm realm, Object valueType)
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description void
addChangeListener(IChangeListener listener)
Adds the given change listener to the list of change listeners.protected void
addListener(Object listenerType, IObservablesListener listener)
void
addValueChangeListener(IValueChangeListener<? super T> listener)
protected abstract T
calculate()
Subclasses must override this method to provide the object's value.protected Object
clone()
static <T> IObservableValue<T>
create(Supplier<T> supplier)
Factory method to createComputedValue
objects in an easy manner.void
dispose()
Disposes of this observable object, removing all listeners registered with this object, and all listeners this object might have registered on other objects.protected T
doGetValue()
protected void
fireEvent(ObservableEvent event)
protected void
firstListenerAdded()
Realm
getRealm()
Object
getValueType()
The value type of this observable value, ornull
if this observable value is untyped.protected boolean
hasListeners()
boolean
isStale()
Returns whether the state of this observable is stale and is expected to change soon.protected void
lastListenerRemoved()
protected void
makeDirty()
protected void
removeListener(Object listenerType, IObservablesListener listener)
-
Methods inherited from class org.eclipse.core.databinding.observable.value.AbstractObservableValue
doSetValue, fireChange, fireValueChange, getValue, removeValueChangeListener, setValue
-
Methods inherited from class org.eclipse.core.databinding.observable.AbstractObservable
addDisposeListener, addStaleListener, checkRealm, fireStale, isDisposed, removeChangeListener, removeDisposeListener, removeStaleListener
-
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface org.eclipse.core.databinding.observable.IObservable
addDisposeListener, addStaleListener, getRealm, isDisposed, removeChangeListener, removeDisposeListener, removeStaleListener
-
-
-
-
Method Detail
-
create
public static <T> IObservableValue<T> create(Supplier<T> supplier)
Factory method to createComputedValue
objects in an easy manner.The created list has a null
IObservableValue.getValueType()
.Example observing the size of an
IObservableList
:IObservableValue<Integer> listSizeObservable = ComputedValue.create(() -> observableList.size());
- Parameters:
supplier
-Supplier
, which is tracked usingObservableTracker
to find out observables it uses, in the same manner ascalculate()
.- Returns:
ComputedValue
whose value is computed using the givenSupplier
.- Since:
- 1.6
-
doGetValue
protected final T doGetValue()
- Specified by:
doGetValue
in classAbstractObservableValue<T>
-
calculate
protected abstract T calculate()
Subclasses must override this method to provide the object's value. Any dependencies used to calculate the value must beIObservable
, and implementers must use one of the interface methods tagged TrackedGetter for ComputedValue to recognize it as a dependency.- Returns:
- the object's value
-
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 interfaceIObservable
- Overrides:
isStale
in classAbstractObservableValue<T>
- Returns:
- true if this observable's state is stale and will change soon.
-
getValueType
public Object getValueType()
Description copied from interface:IObservableValue
The value type of this observable value, ornull
if this observable value is untyped.- Returns:
- the value type, or
null
-
hasListeners
protected boolean hasListeners()
- Since:
- 1.1
-
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 interfaceIObservable
- Overrides:
addChangeListener
in classAbstractObservable
- Parameters:
listener
- the listener to add; notnull
-
addValueChangeListener
public void addValueChangeListener(IValueChangeListener<? super T> listener)
- Specified by:
addValueChangeListener
in interfaceIObservableValue<T>
- Overrides:
addValueChangeListener
in classAbstractObservableValue<T>
- Parameters:
listener
- the change listener to add; notnull
-
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 interfaceIObservable
- Overrides:
dispose
in classAbstractObservable
-
addListener
protected void addListener(Object listenerType, IObservablesListener listener)
- Parameters:
listenerType
- arbitrary object to identify a type of the listenerlistener
- the listener to add; notnull
-
removeListener
protected void removeListener(Object listenerType, IObservablesListener listener)
- Parameters:
listenerType
- arbitrary object to identify a type of the listenerlistener
- the listener to remove; notnull
-
fireEvent
protected void fireEvent(ObservableEvent event)
-
firstListenerAdded
protected void firstListenerAdded()
-
lastListenerRemoved
protected void lastListenerRemoved()
-
getRealm
public Realm getRealm()
- Returns:
- Returns the realm.
-
clone
protected Object clone() throws CloneNotSupportedException
- Overrides:
clone
in classObject
- Throws:
CloneNotSupportedException
-
-