189 8069 5689

EffectiveJava——枚举篇精华总结-创新互联

JAVA推荐使用枚举代替int

1 枚举提供了类型安全检测
2 枚举隔离了使用的类和枚举类型,使增加和重排无需重新编译
3 本质上是单元素枚举,final类型,不支持扩展(继承),但是可以自由使用接口和方法。
4 便于理解,维护
5 绝对安全的单例类型(相对于双重锁,无法被反序列化创造多个实例)

创新互联服务项目包括合水网站建设、合水网站制作、合水网页制作以及合水网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,合水网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到合水省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
Android 不建议使用枚举的原因

1 手机内存资源有限,ENUM将会增大最终的DEX文件,大约是Integer常量的13倍,大量使用会影响程序性能。
2 虚拟机加载枚举类,并且实例化所有的枚举项,并且这些枚举实例的内存无法回收,而且枚举是单例,如果自定义的枚举类中包含了大块内存的引用,也可能会带来内存泄露。

实例域代替系数

永远不要根据枚举的序数导出与它关联的值(ordinal()方法虽然从0开始,但是当常量重排序时会混乱),而是要将它保存在一个实例域中:

public enum Ensemble {

SOLO(1), DUET(2), TRIO(3),  QUARTET(4), QUINTET(5),

private final int numberOfMusicians;

Ensemble(int size ) { this.numberOfMusicians = size; }

public int numberOfMusicians() { return numberOfMusicians;}

}
EnumSet代替位域

位域:text.applyStyles(STYLE_BOLD | STYLE_ITALIC);

位域表示的缺陷:位域以数字形式打印时,翻译位域比翻译简单的int枚举常量要困难得多;要遍历位域表示的所有元素也没有很容易的方法。

EnumSet:

public class Text {
    public enum Style {BOLD , ITALIC , UNDERLINE , STRIKETHROUGH}

// Any Set could be passed in , but EnumSet is clearly best

public void applyStyles(Set