diff --git a/internal/util-interface/src/main/java/xsbti/Maybe.java b/internal/util-interface/src/main/java/xsbti/Maybe.java index 3280e5990..0c5ea23b8 100644 --- a/internal/util-interface/src/main/java/xsbti/Maybe.java +++ b/internal/util-interface/src/main/java/xsbti/Maybe.java @@ -4,46 +4,45 @@ package xsbti; /** Intended as a lightweight carrier for scala.Option. */ -public abstract class Maybe -{ - // private pending Scala bug #3642 - protected Maybe() {} +public abstract class Maybe { + private Maybe() {} - public static Maybe just(final s v) - { - return new Maybe() { - public boolean isDefined() { return true; } - public s get() { return v; } - public int hashCode() { return 17 + (v == null ? 0 : v.hashCode()); } - public String toString() { return "Maybe.just(" + v + ")"; } - public boolean equals(Object o) { - if (o == null) return false; - if (!(o instanceof Maybe)) return false; - Maybe other = (Maybe) o; - if (!other.isDefined()) return false; - if (v == null) return other.get() == null; - return v.equals(other.get()); - } - }; - } - public static Maybe nothing() - { - return new Maybe() { - public boolean isDefined() { return false; } - public s get() { throw new UnsupportedOperationException("nothing.get"); } - public int hashCode() { return 1; } - public String toString() { return "Maybe.nothing()"; } - public boolean equals(Object o) { - if (o == null) return false; - if (!(o instanceof Maybe)) return false; - Maybe other = (Maybe) o; - return !other.isDefined(); - } - }; + @SuppressWarnings("unchecked") + public static Maybe nothing() { return (Maybe) Nothing.INSTANCE; } + public static Maybe just(final s v) { return new Just(v); } - } + public static final class Just extends Maybe { + private final s v; - public final boolean isEmpty() { return !isDefined(); } - public abstract boolean isDefined(); - public abstract t get(); + public Just(final s v) { this.v = v; } + + public s value() { return v; } + + public boolean isDefined() { return true; } + public s get() { return v; } + public int hashCode() { return 17 + (v == null ? 0 : v.hashCode()); } + public String toString() { return "Maybe.just(" + v + ")"; } + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || !(o instanceof Just)) return false; + final Just that = (Just) o; + return v == null ? that.v == null : v.equals(that.v); + } + } + + public static final class Nothing extends Maybe { + public static final Nothing INSTANCE = new Nothing(); + private Nothing() { } + + public boolean isDefined() { return false; } + public Object get() { throw new UnsupportedOperationException("nothing.get"); } + + public int hashCode() { return 1; } + public String toString() { return "Maybe.nothing()"; } + public boolean equals(Object o) { return this == o || o != null && o instanceof Nothing; } + } + + public final boolean isEmpty() { return !isDefined(); } + public abstract boolean isDefined(); + public abstract t get(); }