3. 比较枚举常量
判断两个枚举类型常量的值是否相等,可以直接使用“==”,而不用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;
}
4. 创建枚举常量
创建枚举常量主要有三种方法:直接利用枚举类型创建枚举常量、使用Enum的valueOf()静态方法创建枚举常量、使用枚举类型的valueOf()静态方法创建枚举常量。
//直接创建枚举常量
Week mon = Week.MONDAY;
//使用Enum的valueOf()静态方法创建枚举常量
Week tues = Enum.valueOf(Week.class, "TUESDAY");
//使用枚举类型的valueOf()静态方法创建枚举常量
Week wed = Week.valueOf("WEDNESDAY");
5. 定义高级的枚举类型
根据需要,可以在枚举类型中添加构造器、方法和字段,还可以让枚举类型继承接口。
定义接口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. - 星期日