EnumMap小抄
2017-07-06 本文已影响0人
上海马超23
public class EnumMap {
// 存放value的是数组,这点类似List,但更具可读性
private transient Object[] vals;
public EnumMap(Class<K> keyType) {
this.keyType = keyType;
keyUniverse = getKeyUniverse(keyType);
// vals数组的容量就是枚举的数量
vals = new Object[keyUniverse.length];
}
public V put(K key, V value) {
typeCheck(key);
// 枚举的ordinal作为value数组的检索下标
int index = key.ordinal();
Object oldValue = vals[index];
vals[index] = maskNull(value);
if (oldValue == null)
size++;
return unmaskNull(oldValue);
}
// 为啥用Object而不用泛型K
// 因为如果K定义成 ?extends XXXEnum, 那么是没法传入参数了,无论是 XXXEnum的子类还是XXXEnum
// 具体原因可以参考 http://blog.csdn.net/hengyunabc/article/details/7696432
// PS:类似Animal接口List<Animal> 和 实现类List<Dog>,不是父子关系的,只有List<? extends Animal>才行
// 具体参考 https://stackoverflow.com/questions/2575363/generics-list-extends-animal-is-same-as-listanimal
public V get(Object key) {
// 需要先校验key的类型,没法定义成泛型,原因如上,只能做检查
return (isValidKey(key) ?
unmaskNull(vals[((Enum<?>)key).ordinal()]) : null);
}
}