Tips
《Effective Java, Third Edition》一书英文版已经出版,这本书的第二版想必不少人都读过,号称Java四大名著之一,不过第二版2009年出版,到如今已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深入的变化。
在这里第一时间翻译成中文版。供你们学习分享之用。程序员
许多枚举一般与单个int值关联。全部枚举都有一个ordinal
方法,它返回每一个枚举常量类型的数值位置。你可能想从序数中派生一个关联的int值:数据结构
// Abuse of ordinal to derive an associated value - DON'T DO THIS public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET; public int numberOfMusicians() { return ordinal() + 1; } }
虽然这个枚举能正常工做,但对于维护来讲则是一场噩梦。若是常量被从新排序,numberOfMusicians
方法将会中断。 若是你想添加一个与你已经使用的int值相关的第二个枚举常量,则没有那么好运了。 例如,为双四重奏(double quartet)添加一个常量可能会很好,它就像八重奏同样,由8位演奏家组成,可是没有办法作到这一点。学习
此外,若是没有给全部这些int值添加常量,也不能为某个int值添加一个常量。例如,假设你想要添加一个常量,表示一个由12位演奏家组成的三重四重奏(triple quartet)。对于由11个演奏家组成的合奏曲,并无标准的术语,所以你不得不为未使用的int值(11)添加一个虚拟常量(dummy constant)。最多看起来就是有些很差看。若是许多int值是未使用的,则是不切实际的。this
幸运的是,这些问题有一个简单的解决方案。 永远不要从枚举的序号中得出与它相关的值; 请将其保存在实例属性中:翻译
public enum Ensemble { SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5), SEXTET(6), SEPTET(7), OCTET(8), DOUBLE_QUARTET(8), NONET(9), DECTET(10), TRIPLE_QUARTET(12); private final int numberOfMusicians; Ensemble(int size) { this.numberOfMusicians = size; } public int numberOfMusicians() { return numberOfMusicians; } }
枚举规范对此ordinal
方法说道:“大多数程序员对这种方法没有用处。 它被设计用于基于枚举的通用数据结构,如EnumSet
和EnumMap
。“除非你在编写这样数据结构的代码,不然最好避免使用ordinal
方法。设计