第36条:使用 EnumSet 替代位域

位域(Bit Field)这个概念不常见,它可以把数据以二进制位的形式紧凑的存储,它允许程序对此结构的位进行操作。早期计算机资源十分珍贵,使用位域可以十分明显的减少内存占用,提升运行速度。

当我们在使用int 常量时,可以使用位域来表示枚举类型:

public class Text {
public static final int STYLE_BOLD = 1<<0; // 1   
public static final int STYLE_ITALIC = 1<<1; // 2  
public static final int STYLE_UNDERLINE = 1<<2; // 4   
public static final int STYLE_STRIKETHROUGH = 1<<3; // 8   

   // Parameter is bitwise OR of zero or more STYLE_constants
   public void applyStyles(int styles) {.....}
}

这样使用的问题在于:
1:在编写API 时,就必须先预测最多需要多少位。
2:要给位域选择对应的类型,int或long(这决定的数字的最大值)

而使用java包装好的EnumSet 就可以避开上述问题:

public class Text{
    public enum Style{BOLD,ITALIC,UNDERLINE,STRIKETHROUGH}
    public void applyStyles(Set<Style> styles){
          //......
    }
}

EnumSet的性能与位域相当同时事还继承了Cloneable 和Serializable接口,功能更加强大。


image.png

当一个枚举类型的元素主要用于集合中时,应该使用EnumSet.
系统中使用的很少,目前看到的都是在里程碑相关部分看到。之后再遇到类似场景时可以实践一下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容