11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2011 The Guava Authors 31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License. 61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at 71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software 111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and 141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License. 151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.base; 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkNotNull; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.Beta; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible; 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.Serializable; 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections; 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator; 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set; 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport javax.annotation.Nullable; 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * An immutable object that may contain a non-null reference to another object. Each 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * instance of this type either contains a non-null reference, or contains nothing (in 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * which case we say that the reference is "absent"); it is never said to "contain {@code 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * null}". 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>A non-null {@code Optional<T>} reference can be used as a replacement for a nullable 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code T} reference. It allows you to represent "a {@code T} that must be present" and 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * a "a {@code T} that might be absent" as two distinct types in your program, which can 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * aid clarity. 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Some uses of this class include 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <ul> 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>As a method return type, as an alternative to returning {@code null} to indicate 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * that no value was available 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>To distinguish between "unknown" (for example, not present in a map) and "known to 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * have no value" (present in the map, with value {@code Optional.absent()}) 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>To wrap nullable references for storage in a collection that does not support 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code null} (though there are 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <a href="http://code.google.com/p/guava-libraries/wiki/LivingWithNullHostileCollections"> 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * several other approaches to this</a> that should be considered first) 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * </ul> 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>A common alternative to using this class is to find or create a suitable 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <a href="http://en.wikipedia.org/wiki/Null_Object_pattern">null object</a> for the 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * type in question. 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>This class is not intended as a direct analogue of any existing "option" or "maybe" 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * construct from other programming environments, though it may bear some similarities. 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param <T> the type of instance that can be contained. {@code Optional} is naturally 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * covariant on this type, so it is safe to cast an {@code Optional<T>} to {@code 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Optional<S>} for any supertype {@code S} of {@code T}. 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kurt Alfred Kluever 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 10.0 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@Beta 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic abstract class Optional<T> implements Serializable { 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns an {@code Optional} instance with no contained reference. 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <T> Optional<T> absent() { 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (Optional<T>) Absent.INSTANCE; 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns an {@code Optional} instance containing the given non-null reference. 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <T> Optional<T> of(T reference) { 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new Present<T>(checkNotNull(reference)); 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * If {@code nullableReference} is non-null, returns an {@code Optional} instance containing that 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * reference; otherwise returns {@link Optional#absent}. 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <T> Optional<T> fromNullable(@Nullable T nullableReference) { 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (nullableReference == null) 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ? Optional.<T>absent() 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert : new Present<T>(nullableReference); 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private Optional() {} 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns {@code true} if this holder contains a (non-null) instance. 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public abstract boolean isPresent(); 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns the contained instance, which must be present. If the instance might be 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * absent, use {@link #or(Object)} or {@link #orNull} instead. 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IllegalStateException if the instance is absent ({@link #isPresent} returns 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code false}) 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public abstract T get(); 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns the contained instance if it is present; {@code defaultValue} otherwise. If 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * no default value should be required because the instance is known to be present, use 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link #get()} instead. For a default value of {@code null}, use {@link #orNull}. 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public abstract T or(T defaultValue); 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns this {@code Optional} if it has a value present; {@code secondChoice} 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * otherwise. 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public abstract Optional<T> or(Optional<? extends T> secondChoice); 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns the contained instance if it is present; {@code supplier.get()} otherwise. If the 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * supplier returns {@code null}, a {@link NullPointerException} will be thrown. 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws NullPointerException if the supplier returns {@code null} 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public abstract T or(Supplier<? extends T> supplier); 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns the contained instance if it is present; {@code null} otherwise. If the 1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * instance is known to be present, use {@link #get()} instead. 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Nullable public abstract T orNull(); 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns an immutable singleton {@link Set} whose only element is the 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * contained instance if it is present; an empty immutable {@link Set} 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * otherwise. 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 11.0 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public abstract Set<T> asSet(); 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns {@code true} if {@code object} is an {@code Optional} instance, and either 1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the contained references are {@linkplain Object#equals equal} to each other or both 1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * are absent. Note that {@code Optional} instances of differing parameterized types can 1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * be equal. 1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public abstract boolean equals(@Nullable Object object); 1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns a hash code for this instance. 1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public abstract int hashCode(); 1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns a string representation for this instance. The form of this string 1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * representation is unspecified. 1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public abstract String toString(); 1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns the value of each present instance from the supplied {@code optionals}, in order, 1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * skipping over occurrences of {@link Optional#absent}. Iterators are unmodifiable and are 1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * evaluated lazily. 1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 11.0 1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <T> Iterable<T> presentInstances(final Iterable<Optional<T>> optionals) { 1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNotNull(optionals); 1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new Iterable<T>() { 1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Iterator<T> iterator() { 1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new AbstractIterator<T>() { 1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private final Iterator<Optional<T>> iterator = checkNotNull(optionals.iterator()); 1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected T computeNext() { 1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert while (iterator.hasNext()) { 1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Optional<T> optional = iterator.next(); 1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (optional.isPresent()) { 1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return optional.get(); 1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return endOfData(); 1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final long serialVersionUID = 0; 1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final class Present<T> extends Optional<T> { 1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private final T reference; 2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Present(T reference) { 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.reference = reference; 2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean isPresent() { 2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return true; 2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public T get() { 2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return reference; 2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public T or(T defaultValue) { 2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNotNull(defaultValue, "use orNull() instead of or(null)"); 2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return reference; 2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Optional<T> or(Optional<? extends T> secondChoice) { 2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNotNull(secondChoice); 2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return this; 2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public T or(Supplier<? extends T> supplier) { 2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNotNull(supplier); 2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return reference; 2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public T orNull() { 2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return reference; 2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Set<T> asSet() { 2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Collections.singleton(reference); 2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean equals(@Nullable Object object) { 2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (object instanceof Present) { 2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Present<?> other = (Present<?>) object; 2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return reference.equals(other.reference); 2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int hashCode() { 2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return 0x598df91c + reference.hashCode(); 2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public String toString() { 2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return "Optional.of(" + reference + ")"; 2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final long serialVersionUID = 0; 2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final class Absent extends Optional<Object> { 2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final Absent INSTANCE = new Absent(); 2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean isPresent() { 2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Object get() { 2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new IllegalStateException("value is absent"); 2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Object or(Object defaultValue) { 2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return checkNotNull(defaultValue, "use orNull() instead of or(null)"); 2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") // safe covariant cast 2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Optional<Object> or(Optional<?> secondChoice) { 2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (Optional) checkNotNull(secondChoice); 2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Object or(Supplier<?> supplier) { 2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return checkNotNull(supplier.get(), 2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert "use orNull() instead of a Supplier that returns null"); 2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override @Nullable public Object orNull() { 2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return null; 2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Set<Object> asSet() { 2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Collections.emptySet(); 2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean equals(@Nullable Object object) { 2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return object == this; 2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int hashCode() { 2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return 0x598df91c; 2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public String toString() { 2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return "Optional.absent()"; 2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private Object readResolve() { 3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return INSTANCE; 3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final long serialVersionUID = 0; 3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 307