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);
    }
}
上一篇下一篇

猜你喜欢

热点阅读