一、什么是枚举
java中定义枚举类型使用enum关键字,是为了替代使用static final的一中可选的用法,比起直接使用static final,使用枚举更加方便。看如下代码:
package cn.mike;
public enum EnumTest {
MON,TUE,WED,THU,FRI,SAT,SUN;
public static void main(String[] args) {
System.out.println(EnumTest.FRI);
}
}
可以在测试类中EnumTest.MON使用即可。
二、原理解析
枚举类型结果编译器解析以后其实就是一个class final 类型,例如如下代码:
enum
AccountType
{
SAVING,
FIXED, CURRENT;
private
AccountType()
{
System.out.println(“It
is a account type”);
}
}
经过对编译后的class反编译以后,得到一个类public
final class
AccountType extends java.lang.Enum<EnumTest>,所有的枚举类型的父类都是
java.lang.Enum<?
extends Enum>,如下
枚举类在后台实现时,实际上是转化为一个继承了java.lang.Enum类的实体类,原先的枚举类型变成
对应的实体类型,上例中AccountType变成了个class AccountType,并且会生成一个新的构造函数,若原来有构造函数,则在此基础上添加两个参数,生成新的构造函数,如上例子中:
1
|
private
AccountType(){ System.out.println(“It is a account type”); } |
会变成:
1
2
|
private
AccountType(String s, int
i){ super (s,i);
System.out.println(“It is a account type”); } |
1
2
3
|
public
static
final
AccountType SAVING; public
static
final
AccountType FIXED; public
static
final
AccountType CURRENT; |
而且还会添加一段static代码段:
1
2
3
4
5
6
|
static { SAVING
= new
AccountType( "SAVING" , 0 ); ...
CURRENT = new
AccountType( "CURRENT" , 0 ); $VALUES
= new
AccountType[]{ SAVING,
FIXED, CURRENT }
} |
三、自定义枚举属性和方法
package
cn.mike;
public enum EnumTest2 {
MON(1),TUE(2),WED(3),THU(4),FRI(5),SAT(6){
//相当于匿名内部类,重载父类的isRest()方法
@Override
public boolean isRest() {
return true;
}
},
SUN(0){
@Override
public boolean isRest() {
return true;
}
};
public static void main(String[] args) {
System.out.println(EnumTest2.FRI);
}
int value;
private EnumTest2(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public boolean isRest(){
return false;
}
}
其实枚举中的每一个属性,例如上例子中的MON(1),TUE(2),WED(3),THU(4),FRI(5),SAT(6)在解析成class对象以后,都是一个static final EnumTest2
的对象,我们在其中定义的属性和方法就可以通过EnumTest2.MON.getValue()来访问。