java中enum用法及和swtich结合使用

来源:互联网 发布:河南大学软件学院图片 编辑:程序博客网 时间:2024/06/06 11:36

enum用法

语法(定义)

创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类),此类不能手工进行子类定义。枚举类型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。

简单用法

Enum一般用来表示一组相同类型的常量。如性别、日期、月份、颜色等。对这些属性用常量的好处是显而易见的,不仅可以保证单例,且比较时候可以用”==”来替换equals。是一种好的习惯。例如:
性别:
public enum SexEnum {
MALE,FEMALE;
}
本质上 male=0,female=1;但是用这种方式表达比直接用0,1,2,3要形象和富有意义。
这段代码实际上调用了2次 Enum(String name, int ordinal):
new Enum<EnumTest>("MALE",0);
new Enum<EnumTest>("FEMALE",1);

复杂用法:

上面的是一个最简单的最具有代表的枚举。
public enum Gender{
//通过括号赋值,而且必须带有一个参构造器和一个属性跟方法,否则编译出错
//赋值必须都赋值或都不赋值,不能一部分赋值一部分不赋值;根据括号中的参数调用响应的构造函数

MALE("MAN"), FEMALE("WOMEN");

private final String value;

//构造器默认也只能是private, 从而保证构造函数只能在内部使用
private Gender(String value) {
this.value = value;
}

public String getValue() {
return value;
}
}

public enum OrderState {
/** 已取消 */
CANCEL {public String getName(){return "已取消";}},
/** 待审核 */
WAITCONFIRM {public String getName(){return "待审核";}},
/** 等待付款 */
WAITPAYMENT {public String getName(){return "等待付款";}},
/** 正在配货 */
ADMEASUREPRODUCT {public String getName(){return "正在配货";}},
/** 等待发货 */
WAITDELIVER {public String getName(){return "等待发货";}},
/** 已发货 */
DELIVERED {public String getName(){return "已发货";}},
/** 已收货 */
RECEIVED {public String getName(){return "已收货";}};

public abstract String getName();
}

遍历、switch 等常用操作

对enum进行遍历和switch的操作示例代码:
public class Test {
public static void main(String[] args) {
for (Gender e : Gender.values()) {
System.out.println(e.toString());
}
Gender test = Gender.TUE;
switch (test) {
case MALE:
System.out.println("男人");
break;
case FEMALE:
System.out.println("女人");
break;
default:
System.out.println(test);
break;
}
}
}
在Java7之前,switch只能支持 byte、short、char、int或者其对应的封装类以及Enum类型。在Java7中,也支持了String类型。
大家也注意到了case后面不是EnumTest.MON,如果是的话,会编译报错,可以这样理解:case支持默认可以转为int的值,如果添加限定词的话,就代表一个类,如果不添加内部可能按其0,1,2处理,可以看下enum的构造函数new Enum<EnumTest>("MON",0),switch的时候默认查询比较的也是enum中的ordinal值。这个值可以看做是序号,大家可以dubug看下。

查考:
http://www.cnblogs.com/hyl8218/p/5088267.html