aboutsummaryrefslogtreecommitdiffstats
path: root/guava/src/com/google/common/collect/ImmutableBiMap.java
diff options
context:
space:
mode:
Diffstat (limited to 'guava/src/com/google/common/collect/ImmutableBiMap.java')
-rw-r--r--guava/src/com/google/common/collect/ImmutableBiMap.java130
1 files changed, 84 insertions, 46 deletions
diff --git a/guava/src/com/google/common/collect/ImmutableBiMap.java b/guava/src/com/google/common/collect/ImmutableBiMap.java
index d7968b2..9d8e144 100644
--- a/guava/src/com/google/common/collect/ImmutableBiMap.java
+++ b/guava/src/com/google/common/collect/ImmutableBiMap.java
@@ -16,13 +16,12 @@
package com.google.common.collect;
-import static com.google.common.base.Preconditions.checkNotNull;
-
import com.google.common.annotations.GwtCompatible;
-import java.util.Collection;
import java.util.Map;
+import javax.annotation.Nullable;
+
/**
* An immutable {@link BiMap} with reliable user-specified iteration order. Does
* not permit null keys or values. An {@code ImmutableBiMap} and its inverse
@@ -44,22 +43,23 @@ import java.util.Map;
public abstract class ImmutableBiMap<K, V> extends ImmutableMap<K, V>
implements BiMap<K, V> {
+ private static final ImmutableBiMap<Object, Object> EMPTY_IMMUTABLE_BIMAP
+ = new EmptyBiMap();
+
/**
* Returns the empty bimap.
*/
// Casting to any type is safe because the set will never hold any elements.
@SuppressWarnings("unchecked")
public static <K, V> ImmutableBiMap<K, V> of() {
- return (ImmutableBiMap<K, V>) EmptyImmutableBiMap.INSTANCE;
+ return (ImmutableBiMap<K, V>) EMPTY_IMMUTABLE_BIMAP;
}
/**
* Returns an immutable bimap containing a single entry.
*/
public static <K, V> ImmutableBiMap<K, V> of(K k1, V v1) {
- checkNotNull(k1, "null key in entry: null=%s", v1);
- checkNotNull(v1, "null value in entry: %s=null", k1);
- return new SingletonImmutableBiMap<K, V>(k1, v1);
+ return new RegularImmutableBiMap<K, V>(ImmutableMap.of(k1, v1));
}
/**
@@ -68,10 +68,7 @@ public abstract class ImmutableBiMap<K, V> extends ImmutableMap<K, V>
* @throws IllegalArgumentException if duplicate keys or values are added
*/
public static <K, V> ImmutableBiMap<K, V> of(K k1, V v1, K k2, V v2) {
- return new Builder<K, V>()
- .put(k1, v1)
- .put(k2, v2)
- .build();
+ return new RegularImmutableBiMap<K, V>(ImmutableMap.of(k1, v1, k2, v2));
}
/**
@@ -81,11 +78,8 @@ public abstract class ImmutableBiMap<K, V> extends ImmutableMap<K, V>
*/
public static <K, V> ImmutableBiMap<K, V> of(
K k1, V v1, K k2, V v2, K k3, V v3) {
- return new Builder<K, V>()
- .put(k1, v1)
- .put(k2, v2)
- .put(k3, v3)
- .build();
+ return new RegularImmutableBiMap<K, V>(ImmutableMap.of(
+ k1, v1, k2, v2, k3, v3));
}
/**
@@ -95,12 +89,8 @@ public abstract class ImmutableBiMap<K, V> extends ImmutableMap<K, V>
*/
public static <K, V> ImmutableBiMap<K, V> of(
K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) {
- return new Builder<K, V>()
- .put(k1, v1)
- .put(k2, v2)
- .put(k3, v3)
- .put(k4, v4)
- .build();
+ return new RegularImmutableBiMap<K, V>(ImmutableMap.of(
+ k1, v1, k2, v2, k3, v3, k4, v4));
}
/**
@@ -110,13 +100,8 @@ public abstract class ImmutableBiMap<K, V> extends ImmutableMap<K, V>
*/
public static <K, V> ImmutableBiMap<K, V> of(
K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) {
- return new Builder<K, V>()
- .put(k1, v1)
- .put(k2, v2)
- .put(k3, v3)
- .put(k4, v4)
- .put(k5, v5)
- .build();
+ return new RegularImmutableBiMap<K, V>(ImmutableMap.of(
+ k1, v1, k2, v2, k3, v3, k4, v4, k5, v5));
}
// looking for of() with > 5 entries? Use the builder instead.
@@ -184,7 +169,11 @@ public abstract class ImmutableBiMap<K, V> extends ImmutableMap<K, V>
* @throws IllegalArgumentException if duplicate keys or values were added
*/
@Override public ImmutableBiMap<K, V> build() {
- return fromEntries(entries);
+ ImmutableMap<K, V> map = super.build();
+ if (map.isEmpty()) {
+ return of();
+ }
+ return new RegularImmutableBiMap<K, V>(map);
}
}
@@ -213,25 +202,18 @@ public abstract class ImmutableBiMap<K, V> extends ImmutableMap<K, V>
}
}
- return fromEntries(ImmutableList.copyOf(map.entrySet()));
- }
-
- static <K, V> ImmutableBiMap<K, V> fromEntries(
- Collection<? extends Entry<? extends K, ? extends V>> entries) {
- switch (entries.size()) {
- case 0:
- return of();
- case 1: {
- Entry<? extends K, ? extends V> entry = Iterables.getOnlyElement(entries);
- return new SingletonImmutableBiMap<K, V>(entry.getKey(), entry.getValue());
- }
- default:
- return new RegularImmutableBiMap<K, V>(entries);
+ if (map.isEmpty()) {
+ return of();
}
+
+ ImmutableMap<K, V> immutableMap = ImmutableMap.copyOf(map);
+ return new RegularImmutableBiMap<K, V>(immutableMap);
}
ImmutableBiMap() {}
+ abstract ImmutableMap<K, V> delegate();
+
/**
* {@inheritDoc}
*
@@ -241,6 +223,26 @@ public abstract class ImmutableBiMap<K, V> extends ImmutableMap<K, V>
@Override
public abstract ImmutableBiMap<V, K> inverse();
+ @Override public boolean containsKey(@Nullable Object key) {
+ return delegate().containsKey(key);
+ }
+
+ @Override public boolean containsValue(@Nullable Object value) {
+ return inverse().containsKey(value);
+ }
+
+ @Override public ImmutableSet<Entry<K, V>> entrySet() {
+ return delegate().entrySet();
+ }
+
+ @Override public V get(@Nullable Object key) {
+ return delegate().get(key);
+ }
+
+ @Override public ImmutableSet<K> keySet() {
+ return delegate().keySet();
+ }
+
/**
* Returns an immutable set of the values in this map. The values are in the
* same order as the parameters used to build this map.
@@ -253,14 +255,50 @@ public abstract class ImmutableBiMap<K, V> extends ImmutableMap<K, V>
* Guaranteed to throw an exception and leave the bimap unmodified.
*
* @throws UnsupportedOperationException always
- * @deprecated Unsupported operation.
*/
- @Deprecated
@Override
public V forcePut(K key, V value) {
throw new UnsupportedOperationException();
}
+ @Override public boolean isEmpty() {
+ return delegate().isEmpty();
+ }
+
+ @Override
+ public int size() {
+ return delegate().size();
+ }
+
+ @Override public boolean equals(@Nullable Object object) {
+ return object == this || delegate().equals(object);
+ }
+
+ @Override public int hashCode() {
+ return delegate().hashCode();
+ }
+
+ @Override public String toString() {
+ return delegate().toString();
+ }
+
+ /** Bimap with no mappings. */
+ @SuppressWarnings("serial") // uses writeReplace(), not default serialization
+ static class EmptyBiMap extends ImmutableBiMap<Object, Object> {
+ @Override ImmutableMap<Object, Object> delegate() {
+ return ImmutableMap.of();
+ }
+ @Override public ImmutableBiMap<Object, Object> inverse() {
+ return this;
+ }
+ @Override boolean isPartialView() {
+ return false;
+ }
+ Object readResolve() {
+ return EMPTY_IMMUTABLE_BIMAP; // preserve singleton property
+ }
+ }
+
/**
* Serialized type for all ImmutableBiMap instances. It captures the logical
* contents and they are reconstructed using public factory methods. This