一、能解决
- 方法参数强制使用者传入预设的值 (更易读更安全)
- 性能相对常量更好 (Android环境除外)
二、values()、ordinal()、valueOf() 方法
自定义枚举类默认继承java.lang.Enum类,并实现了Seriablizable 和Comparable 两个接口。
自带2个属性 name ordinal 和 4个方法 如下
- values() 返回枚举类中所有的值。 -> RED GREEN BLUE 等
- ordinal() 找到每个枚举常量的索引,就像数组索引一样。-> RED = 0
- name()返回枚举常量的名称,正如因为在枚举声明中的声明 -> RED的name值就是”RED”等
- valueOf()返回指定字符串值的枚举常量。-> String转枚举类型。“RED” 得到 RED枚举类型
三、使用办法
public enum ColorEnum{ WHITE("0x000001"),BLACK("0x000002"),GREEN("0x000003"); private final String color; private ColorEnum(String color){ this.color = color; }
public String getColor() { return color; }
public void setColor(String color) { this.color = color; } }
四、区别
1、和类对比
枚举是真正的 final,客户端不允许创建枚举类的实例,也不能对其进行拓展
public class Color {
public static final Color WHITE = new Color(),
BLACK = new Color(),
GREEN = new Color();
private Color() { }
}
2、和常量的区别
- 无法限制开发员继承/实现接口。(枚举是final的构造方法是私有的)
- 常量作为参数时,如果是String,int等弱类型无法通过编译器发现。(常量无法 限制开发人员传入的参数数值,而枚举可以在编译阶段强制要求开发人员传入规定数值)
- 由于开发员可以直接写常量值, 所以不能用==对比,只能用equals对比,不能优化性能(枚举 equals 也会转化为 == 可参https://www.cnblogs.com/xiohao/p/7405423.html )
- 编译时,是直接把常量的值编译到类的二进制代码里,常量的值在升级中变化后,需要重新编译所有引用常量的类,因为里面存的是旧值. (常量是装载的时候放入堆里,如果发生变化,需要重新编译装载)
五、Andoid环境中的枚举
1、枚举增大 DEX 大小,并会增大运行时的内存分配大小
枚举的实现原理就是定义一个类,然后实例化几个由final修饰的这个类的对象,每个实例都带有自己的元信息。而常量相比之下,没有这一层封装,只占用最基本的内存,包括引用,和它的值本身,要简单轻巧很多。
2、Android中枚举替代方案 参考: https://blog.csdn.net/Devilli0310/article/details/103761891 https://www.jianshu.com/p/2e43ba184a18