在不该用列举类之前,一样平常利用接口静态常量实现。比如:
public interface Season { public static final int SPRING = 1; public static final int SUMMER = 2; public static final int AUTUMN = 3; public static final int WINTER = 4;}
利用JUnit利用测试如下:
@Testpublic void noEnum() { int i = 1; Assert.assertTrue(Season.SPRING==i);}
利用接口静态常量的办法比较难限定变量的范围,而且定义繁琐,功能也很有限,于是在Java 1.5 中定义了一个列举类型:java.lang.Enum。

类似类(class)和接口(interface)的定义,Java供应enum关键字用来定义列举类,在IDEA中创建列举类的菜单如下:
同样定义一个时令的列举类, 代码可以简洁如下:
package cn.osxm.jcodef.func.base;public enum SeasonEnum { SPRING, SUMMER, AUTUMN, WINTER}
在列举类中直接列出常量,常量遵照全部大写的规则。在上面的列举类示例代码中,SPRING, SUMMER, AUTUMN, WINTER 是SeasonEnum的成员。
列举成员默认是final、public、static (以是可以利用SeasonEnum.SPRING办法调用列举成员)每一个列举类型成员都可以看作是列举类的实例 (SeasonEnum.SPRING的类型也是SeasonEnum)在JUnit利用测试如下:
@Test public void enumBase() { SeasonEnum season = SeasonEnum.SPRING; Assert.assertTrue(season.equals(SeasonEnum.SPRING)); }
Java 列举类的特性
Java列举类的特性有:
列举可以实现接口,但不能继续接口,也不能被继续。列举类是final的,以是不能继续。列举类的布局方法是私有的列举成员是静态、final和public列举成员是列举类的实例但是从上面SeasonEnum列举类的定义来看,完备看不出这些特性,这些特性是怎么来的呢? 请看下面的事理探求。
Java列举类实现的事理探求ava列举类型的奥秘就在编译阶段,列举类在编译后会天生了一个扩展java.lang.Enum的类。这个可以通过JDK自带的javap工具来反编译天生的.class文件。对上面的天生的SeasonEnum.class文件进行反编译,由于这个文件的包路径是cn\osxm\jcodef\func\base,以是在命令行利用如下命令:
javap -p cn\osxm\jcodef\func\base\SeasonEnum.class
-p参数的意思是反编译代码中包含私有的方法, p是private的意思。
从掌握台输出的反编译后的源码可以看出:
自定义的列举类会自动继续java.lang.Enum类每个成员变量都会被转换为 private static final的列举类型的实例自动添加private的布局函数 从反编译后的源码就不难明得Enum的特性了。把稳: 利用专门的Java反编译工具,比如JD GUI、luyten等对Eumn进行反编译的效果靠近源码的效果,无法看到继续等特性,JD-GUI反编译的效果和源码时同等的,这也解释利用JD GUI来进行实际的反编译还是不错的。