美文网首页
EnumMap小抄

EnumMap小抄

作者: 上海马超23 | 来源:发表于2017-07-06 23:41 被阅读0次
    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);
        }
    }
    

    相关文章

      网友评论

          本文标题:EnumMap小抄

          本文链接:https://www.haomeiwen.com/subject/mjvkhxtx.html