com.google.common.collect.EnumBiMap Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of google-collect Show documentation
Show all versions of google-collect Show documentation
Google Collections Library is a suite of new collections and collection-related goodness for Java 5.0
The newest version!
/*
* Copyright (C) 2007 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.common.collect;
import static com.google.common.base.Preconditions.checkArgument;
import java.util.EnumMap;
import java.util.Map;
/**
* A {@code BiMap} backed by two {@code EnumMap} instances. Null keys and values
* are not permitted.
*
* @author Mike Bostock
*/
public final class EnumBiMap, V extends Enum>
extends StandardBiMap {
private final Class keyType;
private final Class valueType;
/**
* Constructs a new empty bimap using the specified key type and value type.
*
* @param keyType the key type
* @param valueType the value type
*/
public EnumBiMap(Class keyType, Class valueType) {
super(new EnumMap(keyType), new EnumMap(valueType));
this.keyType = keyType;
this.valueType = valueType;
}
/**
* Constructs a new bimap with the same mappings as the specified map.
*
* @param map the map whose mappings are to be placed in this map
*/
public EnumBiMap(EnumBiMap map) {
this(map.keyType, map.valueType);
putAll(map); // careful if we make this class non-final
}
/**
* Constructs a new bimap with the same mappings as the specified map. If the
* specified map is an {@code EnumBiMap} instance, this constructor behaves
* identically to {@link #EnumBiMap(EnumBiMap)}. Otherwise, the specified map
* must contain at least one mapping (in order to determine the new enum
* bimap's key and value types).
*
* @param map the map whose mappings are to be placed in this map
* @throws IllegalArgumentException if map is not an {@code EnumBiMap}
* instance and contains no mappings
*/
public EnumBiMap(Map map) {
this(inferKeyType(map), inferValueType(map));
putAll(map); // careful if we make this class non-final
}
static > Class inferKeyType(Map map) {
if (map instanceof EnumBiMap, ?>) {
return ((EnumBiMap) map).keyType;
}
if (map instanceof EnumHashBiMap, ?>) {
return ((EnumHashBiMap) map).keyType;
}
checkArgument(!map.isEmpty());
return map.keySet().iterator().next().getDeclaringClass();
}
private static > Class inferValueType(Map, V> map) {
if (map instanceof EnumBiMap, ?>) {
return ((EnumBiMap, V>) map).valueType;
}
checkArgument(!map.isEmpty());
return map.values().iterator().next().getDeclaringClass();
}
/** Returns the associated key type. */
public Class keyType() {
return keyType;
}
/** Returns the associated value type. */
public Class valueType() {
return valueType;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy