用枚举的意义在于什么?确保调用方法的时候,如果方法的参数只是某些常数,编译器仅仅进行普通的类型检查是不够的。需要让编译器确定这些常数是不是可以接受的范围内的。
利用在博文:http://blog.csdn.net/firehotest/article/details/56008900中曾提到,Font的初始化方式如下:
java.awt.Font bigFont = new Font(Font.SERIF, Font.BOLD, 20);
JLabelObject,setFont(bigFont);
观察Font的API说明发现,Font.SERIF、Font.BOLD其实都是一些常数而已。而上述的构造函数的参数只有在某些值内才有意义,但如果用户记错了顺序或者手工输入了一些范围外的int值,编译也是会通过的。需要怎么避免这种情况呢?
这时候就要用到枚举来代替常量了。如果输入的不是对应的枚举类型,那么编译器在编译的时候就会报错。因为枚举从编译后的字节码上看,本质就是一种特殊的类。这个类是final static的。
枚举类型默认是每个变量变量作为枚举类型的数据成员。所以,直接调用toString方法的话返回的是当前变量名。如果,想为当前枚举类型赋上其它的意义值可以这么做:
public class EnumTest2 {
/**
* Private nested enumeration of months.
* @author Jeff Eppinger & Terry Lee
*/
private enum Month {
JANUARY(1), FEBRUARY(2), MARCH(3), APRIL(4), MAY(5), JUNE(6), JULY(7), AUGUST(8), SEPTEMBER(9),
OCTOBER(10), NOVEMBER(11), DECEMBER(12);
private int number;
private Month(int n) {
number = n;
}
@Override
public String toString() {
return String.valueOf(number);
}
}
/**
* Private nested enumeration of days of the week.
*/
private enum DayOfWeek {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
@Override
public String toString() {
switch (this) {
case SUNDAY:
case SATURDAY:
return "Weekend :-)";
case FRIDAY:
return "TGIF!!!";
default:
return "Weekday :-(";
}
}
}
/**
* Main method of test program.
* @param args command line arguments
*/
public static void main(String[] args) {
printDate(Month.FEBRUARY, DayOfWeek.THURSDAY);
System.out.println("------");
for (DayOfWeek dow : DayOfWeek.values()) {
System.out.println(dow);
}
}
/**
* Sample method to demo compile-time checking of parameters.
* @param month month value
* @param dow day of the week value
*/
private static void printDate(Month month, DayOfWeek dow) {
System.out.println(month + " " + dow);
}
}