java 枚举
枚举,就是一个常数,在C/C++/C#里存的值是int型。可以在编码时限制输入符号。java的枚举,编译器实质上编译为类,并且是继承Enum抽象类,这意味着有类相同的功能,可以实现接口(但不能继承任何类,因为默认编译已经为它指派继承于Enum抽象类)。下面是枚举的几种形式:
1.普通形式,用于一般场景
类:
enum CmdTypes
{
ADD, UPDATED
}
调用方:
for (CmdTypes item : CmdTypes.values())
{
System.out.println(String.format("%d,%s", item.ordinal(), item.name()));
}
输出结果:
0,ADD
1,UPDATED
分析:ordinal是输出枚举元素所在的索引值。从0开始,name是枚举元素狂吹。values返回枚举元素集合。
2.附加一个元素值:
类:
enum CmdTypes2
{
ADD(1), UPDATED(2);
private final int value;
CmdTypes2(int value)
{
this.value = value;
}
public int getValue()
{
return value;
}
}
调用方:
for (CmdTypes2 item : CmdTypes2.values())
{
System.out.println(String.format("%d,%s", item.getValue(), item.name()));
}
输出结果:
1,ADD
2,UPDATED
分析:可以使每个元素附加一个额外的值,这个值就是value,定义元素有()的,必须以value和构造方法配套,value也可以为其他类型。
3:附加多个元素值:
类:
enum CmdTypes3
{
ADD {
@Override
public int value()
{
return 1;
}
@Override
public String text()
{
return "添加";
}
}, UPDATE {
@Override
public int value()
{
return 2;
}
@Override
public String text()
{
return "修改";
}
};
public abstract int value();
public abstract String text();
}
调用方:
for (CmdTypes3 item : CmdTypes3.values())
{
System.out.println(String.format("%d,%s,%s", item.value(), item.text(), item.name()));
}
输出结果:
1,添加,ADD
2,修改,UPDATE
分析:附加多个值,只需要在枚举类里添加抽象方法,然后再在元素里重写此方法;其实也可以写为普通方法,那就是元素都共用一个方法。
此外,枚举还可以实现接口,只需要按照类实现一样就可以了,如下:
Interface Run { }
enum CmdTypes implements Run { }
由此可见,java枚举要比C#强大很多,因为编译器最终会将枚举编译为类,所以类能实现的枚举基本能实现。