public enum Light { RED, GREEN, YELLOW; }
咱们只可以表示出红灯、绿灯和黄灯,可是具体的值咱们没办法表示出来。 java
别急,既然枚举类型提供了构造函数,咱们能够经过构造函数和覆写toString方法来实现 ide
首先给Light枚举类型增长构造方法,而后每一个枚举类型的值经过构造函数传入对应的参 函数
数, 同时覆写toString方法,在该方法中返回从构造函数中传入的参数,代码如下: 性能
public enum Light { RED("红灯"), GREEN("绿灯"), YELLOW("黄灯"); private String code; private Light(String code) { this.code = code; } // @Override // public String toString() { // return String.valueOf(this.code); // } } class EnumTest{ public static void main(String[] args) { System.out.println("============演示枚举类型的遍历:"); testListEnum(); } static void testListEnum(){ Light[] allLight = Light.values(); for (Light light:allLight) { System.out.println("当前灯name:"+light.name()); System.out.println("当前灯顺序:"+light.ordinal()); System.out.println("当前灯:"+light); } } }
常量和枚举的区别: 优化
public interface ConstInterfaceA { public static final String CONST_A = "aa"; public static final String CONST_C = "ac"; }
存在问题: this
1) 没法限制开发员继承/实现接口. spa
2) 常量做为参数时,是String,int等弱类型,开发员传入没有在常量接口里定义的值,这个问题没法经过编译器发现. code
3) 因为开发员能够直接写常量值, 因此不能用==对比,只能用equals对比,不能优化性能 继承
4) 编译时,是直接把常量的值编译到类的二进制代码里,常量的值在升级中变化后,须要从新编译全部引用常量的类,由于里面存的是旧值. 接口
public class ConstClassA { public static final String CONST_A = "aa"; public static final String CONST_C = "ac"; private ConstClassA() { } }
常量类能够设置构造函数为private,从而限制继承,也就没有继续添加常量的问题了.
可是其余问题与常量接口同样没法解决!
枚举类型解决了以上全部问题,主要体如今:
1) 私有构造函数,避免被继承和扩展.
2) 定义方法的参数时,必须用枚举常量类类型,如上面的EnumClassA类型,这样就转变成了强类型,不会出现弱类型引发的问题.
3) 常量值地址惟一,能够用==直接对比,性能会有提升.
4) 编译时,没有把常量值编译到代码里,即便常量的值发生变化也不会影响引用常量的类.