1/* 2 * Copyright (C) 2009 The Guava Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.google.common.collect; 18 19import static com.google.common.base.Preconditions.checkNotNull; 20 21import java.util.Collections; 22 23/** 24 * GWT emulation of {@link SingletonImmutableBiMap}. 25 * 26 * @author Hayward Chan 27 */ 28final class SingletonImmutableBiMap<K, V> extends ImmutableBiMap<K, V> { 29 30 // These references are used both by the custom field serializer, and by the 31 // GWT compiler to infer the keys and values of the map that needs to be 32 // serialized. 33 // 34 // Although they are non-final, they are package private and the reference is 35 // never modified after a map is constructed. 36 K singleKey; 37 V singleValue; 38 39 transient SingletonImmutableBiMap<V, K> inverse; 40 41 SingletonImmutableBiMap(K key, V value) { 42 super(Collections.singletonMap(checkNotNull(key), checkNotNull(value))); 43 this.singleKey = key; 44 this.singleValue = value; 45 } 46 47 private SingletonImmutableBiMap( 48 K key, V value, SingletonImmutableBiMap<V, K> inverse) { 49 super(Collections.singletonMap(checkNotNull(key), checkNotNull(value))); 50 this.singleKey = key; 51 this.singleValue = value; 52 this.inverse = inverse; 53 } 54 55 @Override 56 public ImmutableBiMap<V, K> inverse() { 57 ImmutableBiMap<V, K> result = inverse; 58 if (result == null) { 59 return inverse = new SingletonImmutableBiMap<V, K>(singleValue, singleKey, this); 60 } else { 61 return result; 62 } 63 } 64 65 @Override 66 public ImmutableSet<V> values() { 67 return ImmutableSet.of(singleValue); 68 } 69} 70