Java中所有的枚举类型都是java.lang.Enum的子类。
简单定义一个枚举类型,如下:
public enum Week { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; }
可以使用枚举类型的values()静态方法返回枚举类型中的所有枚举值,使用枚举常量的name()方法返回枚举常量的名称,使用枚举常量的ordinal()方法返回枚举常量的序数(常量在枚举声明中的位置,从0开始)。示例代码如下:
public static void main(String[] args) { //获取枚举类型中的全部枚举值 Week[] days = Week.values(); for(Week day : days) { //返回枚举常量的名称 String name = day.name(); //返回枚举常量的序数(常量在枚举声明中的位置,从0开始) int ordinal = day.ordinal(); String toString = day.toString(); Class declaringClass = day.getDeclaringClass(); Class superClass = declaringClass.getSuperclass(); System.out.println( "Name: " + name + "\n" + "Ordinal: " + ordinal + "\n" + "ToString: " + toString + "\n" + "DeclaringClass: " + declaringClass + "\n" + "SuperClass: " + superClass + "\n" ); } }输出结果如下:
Name: MONDAY Ordinal: 0 ToString: MONDAY DeclaringClass: class myEnum.Week SuperClass: class java.lang.Enum Name: TUESDAY Ordinal: 1 ToString: TUESDAY DeclaringClass: class myEnum.Week SuperClass: class java.lang.Enum Name: WEDNESDAY Ordinal: 2 ToString: WEDNESDAY DeclaringClass: class myEnum.Week SuperClass: class java.lang.Enum Name: THURSDAY Ordinal: 3 ToString: THURSDAY DeclaringClass: class myEnum.Week SuperClass: class java.lang.Enum Name: FRIDAY Ordinal: 4 ToString: FRIDAY DeclaringClass: class myEnum.Week SuperClass: class java.lang.Enum Name: SATURDAY Ordinal: 5 ToString: SATURDAY DeclaringClass: class myEnum.Week SuperClass: class java.lang.Enum Name: SUNDAY Ordinal: 6 ToString: SUNDAY DeclaringClass: class myEnum.Week SuperClass: class java.lang.Enum
判断两个枚举类型常量的值是否相等,可以直接使用“==”,而不用equals()方法。比较两个枚举类型常量的值的大小,可以使用compareTo()方法。
public static void main(String[] args) { Week mon = Week.MONDAY; Week tues = Week.TUESDAY; Week wed = Week.WEDNESDAY; //比较枚举常量,实际上是比较它们序数的大小 System.out.println(mon.compareTo(tues)); System.out.println(tues.compareTo(wed)); System.out.println(wed.compareTo(mon)); }
输出结果如下:
-1 -1 2实际上,比较两个枚举常量的大小,就是比较它们序数ordinal的大小。在JDK1.6的Enum源码中compareTo()方法如下:
public final int compareTo(E o) { Enum other = (Enum)o; Enum self = this; if (self.getClass() != other.getClass() && // optimization self.getDeclaringClass() != other.getDeclaringClass()) throw new ClassCastException(); return self.ordinal - other.ordinal; }
创建枚举常量主要有三种方法:直接利用枚举类型创建枚举常量、使用Enum的valueOf()静态方法创建枚举常量、使用枚举类型的valueOf()静态方法创建枚举常量。
//直接创建枚举常量 Week mon = Week.MONDAY; //使用Enum的valueOf()静态方法创建枚举常量 Week tues = Enum.valueOf(Week.class, "TUESDAY"); //使用枚举类型的valueOf()静态方法创建枚举常量 Week wed = Week.valueOf("WEDNESDAY");
根据需要,可以在枚举类型中添加构造器、方法和字段,还可以让枚举类型继承接口。
定义接口IWeek,如下:
public interface IWeek { public void println(); }定义高级的枚举类型AdvancedWeek,拥有自己的构造器、方法和字段,并实现IWeek接口。
public enum AdvancedWeek implements IWeek{ MONDAY("星期一", "Mon."), TUESDAY("星期二", "Tues."), WEDNESDAY("星期三", "Wed."), THURSDAY("星期四", "Thurs."), FRIDAY("星期五", "Fri."), SATURDAY("星期六", "Sat."), SUNDAY("星期日", "Sun."); private String nameCn; private String abbreviation; //构造方法只能为private private AdvancedWeek() {} private AdvancedWeek(String nameCn, String abbreviation) { this.setNameCn(nameCn); this.setAbbreviation(abbreviation); } public String getNameCn() { return nameCn; } public void setNameCn(String nameCn) { this.nameCn = nameCn; } public String getAbbreviation() { return abbreviation; } public void setAbbreviation(String abbreviation) { this.abbreviation = abbreviation; } public void println() { System.out.println(this.ordinal() + " - " + this.name() + " - " + this.getAbbreviation() + " - " + this.getNameCn()); } }需要注意的是,枚举类型的构造方法只能为private。
测试AdvancedWeek,如下:
public static void main(String[] args) { AdvancedWeek[] days = AdvancedWeek.values(); for(AdvancedWeek day : days) { day.println(); } }输出结果为:
0 - MONDAY - Mon. - 星期一 1 - TUESDAY - Tues. - 星期二 2 - WEDNESDAY - Wed. - 星期三 3 - THURSDAY - Thurs. - 星期四 4 - FRIDAY - Fri. - 星期五 5 - SATURDAY - Sat. - 星期六 6 - SUNDAY - Sun. - 星期日
原文:http://blog.csdn.net/snarlfuture/article/details/18996037