package ch.akuhn.values;
import java.util.EventObject;
public abstract class ComputedValue<V> extends ReferenceValue<V> {
private static final Object MISSING = new Object();
@SuppressWarnings("unchecked")
private V missingValue() {
return (V) MISSING;
}
private boolean isLazy = true;
private Value<?>[] arguments;
public ComputedValue() {
this.value = missingValue();
this.arguments = null;
}
public ComputedValue(Value<?>... arguments) {
this.value = missingValue();
this.arguments = arguments;
for (Value<?> each: arguments) each.addDependent(this);
}
@Override
public V getValue() {
if (value == MISSING) value = computeValue(new Arguments(arguments));
return this.value;
}
@Override
public void setValue(V value) {
throw new UnsupportedOperationException();
}
public void resetValue() {
value = isLazy ? missingValue() : computeValue(new Arguments(arguments));
this.changed();
}
protected abstract V computeValue(Arguments arguments);
@Override
public void valueChanged(EventObject event) {
this.resetValue();
}
}