一、java中的枚举Enum是jdk1.5开始引入的一个新的类型,为开发提供了很大的便利。
enum是一个特殊的class,实际上枚举声明定义的类型就是一个类。
比如下面的一个枚举,我们通过反编译工具可以看到编译后的内容:
public enum ColourEnum {
RED(1, "红色"),
BLUE(2, "蓝色"),
BLACK(3, "蓝色");
// 成员变量
private int state;
private String colour;
// 构造方法
ColourEnum(int state, String colour){
this.state = state;
this.colour = colour;
}
// 枚举循环
public String getColourByState(int state){
for(ColourEnum e : ColourEnum.values()){
if(state == e.getState()){
return e.getColour();
}
}
return null;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public String getColour() {
return colour;
}
public void setColour(String colour) {
this.colour = colour;
}
}
使用工具反编译后的内容:
public final class ColourEnum extends Enum
{
public static final ColourEnum RED;
public static final ColourEnum BLUE;
public static final ColourEnum BLACK;
private int state;
private String colour;
private static final ColourEnum $VALUES[];
public static ColourEnum[] values()
{
return (ColourEnum[])$VALUES.clone();
}
public static ColourEnum valueOf(String name)
{
return (ColourEnum)Enum.valueOf(com/daxitong/service/enums/ColourEnum, name);
}
private ColourEnum(String s, int i, int state, String colour)
{
super(s, i);
this.state = state;
this.colour = colour;
}
public String getColourByState(int state)
{
ColourEnum acolourenum[] = values();
int i = acolourenum.length;
for (int j = 0; j < i; j++)
{
ColourEnum e = acolourenum[j];
if (state == e.getState())
return e.getColour();
}
return null;
}
public int getState()
{
return state;
}
public void setState(int state)
{
this.state = state;
}
public String getColour()
{
return colour;
}
public void setColour(String colour)
{
this.colour = colour;
}
static
{
RED = new ColourEnum("RED", 0, 1, "红色");
BLUE = new ColourEnum("BLUE", 1, 2, "蓝色");
BLACK = new ColourEnum("BLACK", 2, 3, "蓝色");
$VALUES = (new ColourEnum[] {
RED, BLUE, BLACK
});
}
}
通过反编译可以看到其实自定义枚举就是继承了Enum类,然后定义的枚举常量其实就是一个一个对象,在static里面进行了初始化;
二、枚举的好处和特点
- 1、不能有public构造函数,这样就不能自己new一个Enum实例;
- 2、所有枚举的值都是public static finel类型的;
- 3、默认实现了Comparable接口;
- 4、枚举提供了values方法,这样可以方便遍历所有的枚举值;
- 5、枚举的出现可以帮助开发者写出更简洁的代码,更通俗易读;
三、枚举可以用来定义常量,而且提供了比常量更多的方法
- 1、switch用法
public int getColourEnumByState(ColourEnum colourEnum){
int i = 0;
switch (colourEnum) {
case RED :
i = RED.getState();
break;
case BLUE :
i = BLUE.getState();
break;
case BLACK :
i = BLACK.getState();
break;
}
return i;
}
- 2、for循环用法
public String getColourByState(int state){
for(ColourEnum e : ColourEnum.values()){
if(state == e.getState()){
return e.getColour();
}
}
return null;
}