public class ImmutableData>> implements ImmutableDataManipulator, M> { private final M mutable; /** * Constructors a wrapper ImmutableData around the specified mutable copy. *

* All calls to this ImmutableData will be relayed directly to an inner copy of {@link M}. * If a certain mutable manipulator is not side-effect free, they are required to extend this class and override the offending operations. *

* * @param mutable The mutable version to represent */ public ImmutableData(M mutable) { this.mutable = mutable.copy(); } @Override public M asMutable() { return mutable.copy(); } @Override public int compareTo(ImmutableData o) { return mutable.compareTo(o.mutable); } @Override public Optional get(Key> key) { return mutable.get(key); } @Override public int getContentVersion() { return mutable.getContentVersion(); } @Override public Set> getKeys() { return mutable.getKeys(); } @Override public > Optional getValue(Key key) { return mutable.getValue(key); } @Override public Set> getValues() { return mutable.getValues(); } @Override public DataContainer toContainer() { return mutable.toContainer(); } @Override public boolean supports(BaseValue baseValue) { return mutable.supports(baseValue); } @Override public boolean supports(Key key) { return mutable.supports(key); } }