package com.yoursway.commons.dependencies;
import com.yoursway.utils.annotations.SynchronizeExternallyOrUseFromSingleThread;
@SynchronizeExternallyOrUseFromSingleThread
public abstract class ComputedValue<T> extends MutableValueObject implements Value<T> {
private T value;
public ComputedValue(IdentityObject owner) {
super(owner);
new DependentSection(this) {
public void run() {
recompute();
}
};
}
public final T get() {
willQuery();
return value;
}
protected abstract T compute();
public final void set(T value) {
throw new UnsupportedOperationException();
}
final void recompute() {
value = compute();
didChange();
}
}