------- android培训、java培训、期待与您交流! ----------
在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,
而且“数据集”中的元素是有限的。例如星期一到星期日七个数据元素组成了
一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。在Java中
想表示这种数据集最容易想到的写法可能是这样,我们以表示一周五天的工
作日来举例:
public class WeekDay { publicstatic final int MONDAY = 1; publicstatic final int TUESDAY = 2; publicstatic final int WENSDAY = 3; publicstatic final int THURSDAY = 4; publicstatic final int FRIDAY = 5; } |
这意味着该方法可以接受任何int 类型的值,即使它和WeekDay中定义的所有日期都对应不上。
要解决这个问题就用到了枚举
我们先来写一个简单的枚举类型的定义:
public enum WeekDay{ MONDAY, TUESDAY, WENSDAY, THURSDAY, FRIDAY; //最后这个“;”可写可不写。 } |
注意:虽然所有的枚举类型都继承自java.lang.Enum,但是你不能绕过
关键字“enum”而使用直接继承Enum的方式来定义枚举类型。编译器会
提示错误来阻止你这么做。 WeekDay中定义的五个枚举常量之间使用“ , ”分割开来。
这些常量默认都是“public static final”的,所以你就不必再为它们加上“public static final”
修饰(编译器会提示出错),这也是为什么枚举常量采用大写字母来命名的原因。而且每
一个常量都是枚举类型WeekDay的一个实例。你可以通过类似“WeekDay.MONDAY”这种
格式来获取到WeekDay中定义的枚举常量,也可以采用类似“WeekDay oneDay =
WeekDay.MONDAY”的方式为枚举类型变量赋值(你不能给枚举类型变量分配除了枚举常
量和null以外的值,编译器会提示出错)。
枚举类型除了拥有Enum提供的方法以外,还存在着两个隐藏着的与具体枚举类型相关的静态
方法——values()和valueOf(String arg0)。方法values()可以获得包含所有枚举常量的数组;
方法valueOf是java.lang.Enum中方法valueOf的简化版本,你可以通过它,根据传递的名称来
得到当前枚举类型中匹配的枚举常量。
我们来看一个枚举类型使用的小例子。需求中要求可以对指定的日期进行
相应的信息输出。对于这么简单的需求,这里就使用枚举类型来进行处理。
前面我们已经定义好了包含有五个工作日的枚举类型。下面的代码则是进行
输出的方法:
/** * 根据日期的不同输出相应的日期信息。 *@param weekDay 代表不同日期的枚举常量 */ publicvoid printWeekDay(WeekDay weekDay){ switch(weekDay){ caseMONDAY: System.out.println(“Todayis Monday!”); break; caseTUESDAY: System.out.println(“Todayis Tuesday!”); break; caseWENSDAY: System.out.println(“Todayis Wensday!”); break; caseTHURSDAY: System.out.println(“Todayis hursday!”); break; System.out.println(“Todayis Friday!”); break; default: } } |
在JDK1.5以前,switch操作仅能对int、short、char和byte进行操作。
而在JDK1.5中,switch增加了对枚举类型的支持,因为枚举类型仅含
有有限个可以使用整数代替的枚举常量,这太适合使用switch语句了!
就像上面代码中那样,你在swtich表达式中放置枚举类型变量,就可以
在case标示中直接使用枚举类型中的枚举常量了。
实现带构造方法的枚举:
enum WeekDay { SUN,MON,TUE,WED,THT,FRI,SAT; private int num; private WeekDay() { System.out.println("first"); } private WeekDay(int num) { this.num=num; } } |
实现带有抽象方法的枚举:
enum TrafficLamp { public abstract TrafficLamp nextLamp(); private int num; private TrafficLamp(int num) { this.num=num; } RED(30) { public TrafficLamp nextLamp() { return YELLOW; } }; GREEN(45) { public TrafficLamp nextLamp() { return RED; } }; YELLOW(5) { public TrafficLamp nextLamp() { return GREEN; }; } |
------- android培训、java培训、期待与您交流! ----------