• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Guava Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5  * in compliance with the License. You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software distributed under the License
10  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11  * or implied. See the License for the specific language governing permissions and limitations under
12  * the License.
13  */
14 
15 package com.google.common.base;
16 
17 import static com.google.common.base.Preconditions.checkNotNull;
18 
19 import com.google.common.annotations.GwtCompatible;
20 import java.util.Collections;
21 import java.util.Set;
22 import javax.annotation.CheckForNull;
23 
24 /** Implementation of an {@link Optional} not containing a reference. */
25 @GwtCompatible
26 @ElementTypesAreNonnullByDefault
27 final class Absent<T> extends Optional<T> {
28   static final Absent<Object> INSTANCE = new Absent<>();
29 
30   @SuppressWarnings("unchecked") // implementation is "fully variant"
withType()31   static <T> Optional<T> withType() {
32     return (Optional<T>) INSTANCE;
33   }
34 
Absent()35   private Absent() {}
36 
37   @Override
isPresent()38   public boolean isPresent() {
39     return false;
40   }
41 
42   @Override
get()43   public T get() {
44     throw new IllegalStateException("Optional.get() cannot be called on an absent value");
45   }
46 
47   @Override
or(T defaultValue)48   public T or(T defaultValue) {
49     return checkNotNull(defaultValue, "use Optional.orNull() instead of Optional.or(null)");
50   }
51 
52   @SuppressWarnings("unchecked") // safe covariant cast
53   @Override
or(Optional<? extends T> secondChoice)54   public Optional<T> or(Optional<? extends T> secondChoice) {
55     return (Optional<T>) checkNotNull(secondChoice);
56   }
57 
58   @Override
or(Supplier<? extends T> supplier)59   public T or(Supplier<? extends T> supplier) {
60     return checkNotNull(
61         supplier.get(), "use Optional.orNull() instead of a Supplier that returns null");
62   }
63 
64   @Override
65   @CheckForNull
orNull()66   public T orNull() {
67     return null;
68   }
69 
70   @Override
asSet()71   public Set<T> asSet() {
72     return Collections.emptySet();
73   }
74 
75   @Override
transform(Function<? super T, V> function)76   public <V> Optional<V> transform(Function<? super T, V> function) {
77     checkNotNull(function);
78     return Optional.absent();
79   }
80 
81   @Override
equals(@heckForNull Object object)82   public boolean equals(@CheckForNull Object object) {
83     return object == this;
84   }
85 
86   @Override
hashCode()87   public int hashCode() {
88     return 0x79a31aac;
89   }
90 
91   @Override
toString()92   public String toString() {
93     return "Optional.absent()";
94   }
95 
readResolve()96   private Object readResolve() {
97     return INSTANCE;
98   }
99 
100   private static final long serialVersionUID = 0;
101 }
102