ToB企服应用市场:ToB评测及商务社交产业平台
标题:
为什么在EffectiveJava中建议用EnumSet替换位字段,以及使用EnumMap替换序
[打印本页]
作者:
盛世宏图
时间:
2024-9-13 20:15
标题:
为什么在EffectiveJava中建议用EnumSet替换位字段,以及使用EnumMap替换序
在
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;}
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4