package ch.akuhn.values; public class ImmutableValue<V> implements Value<V> { private final Throwable error; private final V value; public ImmutableValue(V value, Throwable error) { this.error = error; this.value = value; } @Override public void addDependent(ValueChangedListener dependent) { // ignore } @Override public ImmutableValue<V> asImmutable() { return this; } @Override public Throwable getError() { return error; } @Override public V getValueOrFail() { if (isError()) throw Values.throwError(error); return value; } @Override public boolean isError() { return error != null; } @Override public void removeDependent(ValueChangedListener dependent) { // ignore } @Override public void setError(Throwable error) { throw new UnsupportedOperationException(); } @Override public void setValue(Object value) { throw new UnsupportedOperationException(); } @Override public V getValue() { return value; } @Override public int hashCode() { return error != null ? error.getClass().hashCode() : value != null ? value.hashCode() : 0; } @Override @SuppressWarnings("unchecked") public boolean equals(Object obj) { if (!(obj instanceof ImmutableValue)) return false; ImmutableValue other = (ImmutableValue) obj; if (error != null || other.error != null) return Values.equal(error, other.error); return Values.equal(value, other.value); } }