一、能解决

  1. 方法参数强制使用者传入预设的值 (更易读更安全)
  2. 性能相对常量更好 (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枚举类型 image.png


三、使用办法

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中枚举替代方案 首先,引入依赖包:.jpg 3.jpg 2.jpg 参考: https://blog.csdn.net/Devilli0310/article/details/103761891 https://www.jianshu.com/p/2e43ba184a18