为什么在EffectiveJava中建议用EnumSet替换位字段,以及使用EnumMap替换序 ...

打印 上一主题 下一主题

主题 884|帖子 884|积分 2652

EffectiveJava中的第 36条中建议 用 EnumSet 替换位字段,在第37条中建议 用EnumMap替换序数索引,为什么?
EnumSet

EffectiveJava中的第 36条中建议 用 EnumSet 替换位字段
36、用 EnumSet替换位字段

如果枚举类型的元素主要在 Set 中使用,传统上使用 int 枚举模式,通过不同的 2 的平方数为每个常量赋值:
[code]// Bit field enumeration constants - OBSOLETE!public class Text {    public static final int STYLE_BOLD = 1 [] universe = getUniverse(elementType);    if (universe == null)        throw new ClassCastException(elementType + " not an enum");    // 根据枚举元素的巨细判定初始化什么类型的 EnumSet 对象        // 根据数组长度,小于等于64则返回RegularEnumSet        //RegularEnumSet是EnumSet的子类,RegularEnumSet的构造函数中会调用EnumSet的构造函数,将枚举类型、枚举数组保存起来    if (universe.length )e).ordinal());    // 如果枚举元素已经存在时,返回 false    return elements != oldElements;})e).ordinal()); eClass = e.getClass();    // 类型检查    if (eClass != elementType && eClass.getSuperclass() != elementType)        return false;    // 获取标记值    long oldElements = elements;    // 将 remove 的元素对应的比特位上的 1 置 0    elements &= ~(1L )e).ordinal());    return elements != oldElements;})e).ordinal());)e).ordinal())[] ZERO_LENGTH_ENUM_ARRAY = new Enum[0];    // 构造函数    public EnumMap(Class keyClass = key.getClass();//获取类型信息   if (keyClass != keyType && keyClass.getSuperclass() != keyType)       throw new ClassCastException(keyClass + " != " + keyType);})key).ordinal()]) : null);} //对Key值的有效性和类型信息进行判定private boolean isValidKey(Object key) {           if (key == null)              return false;    // Cheaper than instanceof Enum followed by getDeclaringClass    Class keyClass = key.getClass();    return keyClass == keyType || keyClass.getSuperclass() == keyType;})key).ordinal();    Object oldValue = vals[index];    //对应下标元素值设置为null    vals[index] = null;    if (oldValue != null)        size--;//减size    return unmaskNull(oldValue);})key).ordinal()] != null;}
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

盛世宏图

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表