许多枚举天生就与一个独立的int值相关。同时所有枚举都有一个ordinal
方法,它返回每个枚举常量在类型中的数字位置。那么可能有人会这么想,用序数来作为这个独立的int值如何?如以下例子:
public enum Ensemble {
SOLO, DUET, TRIO, QUINTET, SEXTET, SEPTET ,OCTET, NONET, DECTET;
public int numberOfMusicians(){
return ordinal() + 1;
}
}
这个方法的本意是通过枚举常量在类中的序号来表示每种音乐类型演奏的人数。虽然这个枚举不错,但是维护起来就像一场噩梦。
如果常量重新排序,numberOfMusicians
方法就会遭到破坏。另外,可读性太差了。
好的做法应该是:永远不要根据枚举的序号导出与它有关的值,而是要将它保存到一个实例中**:**
public enum Ensemble{
SOLO(1), DUET(2), TRIO(3), QUINTET(4), SEXTET(5),
SEPTET(7), OCTET(8), DOUBLE_QUARTET(8), NONET(9),
DECTET(10), TRIPLE_QUARTRT(12);
private final int numberOfMusicians;
Ensemble(int size){
this.numberOfMusicians = size;
}
public int numberofMusicians(){
return numberOfMusicians;
}
}
Enum规范中谈到ordinal
时这么写到:“大多数的程序员都不需要这个方法。它是设计成用于像EnumSet
和EnumMap
这种基于枚举的通用数据结构的。”除非你在编写的是这种数据结构,否则最好完全避免使用ordinal
方法。