package org.fusesource.restygwt.client.basic; public abstract class Optional<T> { @SuppressWarnings("unchecked") public static <T> Optional<T> absent() { return (Optional<T>) Absent.INSTANCE; } public static <T> Optional<T> of(T reference) { if (reference == null) { throw new RuntimeException(); } return new Present<T>(reference); } public abstract boolean isPresent(); public abstract T get(); private static class Absent extends Optional<Object> { static final Absent INSTANCE = new Absent(); @Override public boolean isPresent() { return false; } @Override public Object get() { throw new IllegalStateException("Absent.get"); } @Override public boolean equals(Object object) { return object == this; } } private static class Present<T> extends Optional<T> { private final T reference; Present(T reference) { this.reference = reference; } @Override public boolean isPresent() { return true; } @Override public T get() { return reference; } @Override public boolean equals(Object object) { if (object instanceof Present) { Present<?> other = (Present<?>) object; return reference.equals(other.reference); } return false; } } }