枚举是Java SE5增加的是一种类型,即eunm关键字,用于定义变量,以限制变量的赋值 赋值时通过"枚举名.值"来取得相关枚举中的值。它使我们在需啊哟群组并使用枚举类型的时候可以很方便的处理
1. 枚举种类
- 最普通的枚举: 枚举类型的实例是常量,命名惯例是他们都使用大写字母表示。定义枚举时候不要使用中文比如"春天"等中文枚举在现实操作时候比较容易,有可能产生乱码,且不利于国际化操作,
public enum Session {
SPRING, SUMMER, AUTUMN, WINTER;
}
- 带有构造方法的枚举: 通过括号赋值,而且必须有带参构造器和一属性跟方法,否则编译出错赋值必须是都赋值或都不赋值,不能一部分赋值一部分不赋值。如果不赋值则不能写构造器,赋值编译也出错
public enum Month {
Jan(1), Feb(2), Mar(3), Apr(4);
private int num;
public int getNum() {
return num;
}
private Month(int num) {// 注意这里是私有构造
this.num = num;
}
//...
}
2. 枚举的一些常用特性
- 通过"枚举名.值"来取得相关枚举中的值
- 通过"枚举名.values()"来取得枚举数组,常用于遍历
- 通过"枚举名.值.ordinal()"获取枚举的位置坐标。坐标从0开始
- 通过"枚举名.valuesof("xxx")获取名为xxx的枚举
- 通过"枚举名.toString方法来方便的显示实例的名字,通常打印语句很好用
- 枚举有个特别实用的特性,它可以在 switch语句中使用 ,switch要在有限的可能值的介个中选择, enum正满足此要求
3.参考测试示例
/**
* 枚举测试类
*/
public class EnumTest {
//最普通的枚举
public enum Session {
SPRING, SUMMER, AUTUMN, WINTER;
}
//自定义的枚举
public enum Month {
Jan(1), Feb(2), Mar(3), Apr(4);
private int num;
public int getNum() {
return num;
}
private Month(int num) {// 注意这里是私有构造
this.num = num;
}
public static Month getMonthById(int id) throws Exception {
for (Month temp : Month.values()) {
if (id == temp.getNum()) {
return temp;
}
}
throw new Exception("Cant.find.Enum");
}
public static int getIdByMonth(Month month) throws Exception {
for (Month temp : Month.values()) {// Month.values()是一个数组
if (month.compareTo(temp) == 0) {// 比较两个枚举是否相同,相同返回0,不同返回-1
return month.getNum();
}
}
throw new Exception("Cant.find.EnumId");
}
}
public static void main(String[] args) throws Exception {
System.out.println("输出枚举:" + Session.SPRING);
System.out.println("输出枚举:" + Month.Jan);
// 枚举的位置下标从0开始。
System.out.println("输出枚举对应的下标" + Session.SPRING.ordinal());
System.out.println("输出枚举对应的下标" + Month.Jan.ordinal());
System.out.println();
// 当存在数据库操作时候,我们习惯给枚举定义编号,使用时候转换一次
System.out.println("输出1编号对应的月份:" + Month.getMonthById(1));
System.out.println("输出4月对应的枚举编号:" + Month.getIdByMonth(Month.Jan));
System.out.println(Month.valueOf("Feb").ordinal());
}
}