许多枚举自然地与单个int值相关联。所有枚举都有它们的顺序号方法,返回每个枚举常量在它的类型的数值位置。你可能会倾向于从序号导出关联的int值:
image.png
虽然这个枚举可以工作,但它却是维护的噩梦。如果这些常量重排了,numberOfMusicians方法就崩了。如果你想要添加一个第二个枚举常量关联一个早已使用的int值,你就运气不好了。比如,为双四重奏加上一个常量可能会更好,它就像一个八重奏一样,由八个音乐家组成,但是没有办法做到这一点。
另外,如果不为所有中间的int值添加常量,就不能为int值添加常量。比如,假设你想要添加一个常量代表一个三重奏,它包含了十二个音乐家。没有一个由11为音乐家组成的乐团的标准术语,因此你必须为未使用的int值(11)添加一个虚拟常量。充其量,这是丑陋的,如果许多int值未使用,那么这是不切实际的。
幸运的是,这里有一个为这些问题的一个简单的解决方案。永远不要从枚举的顺序值中导出关联的值;而是存储它在一个实例字段中:
Enum规范有关序数的说明:“这个方法对于大多数程序员没有用,它是为通用的数据结构(如EnumSet和EnumMap)所设计的”。除非你正在用此字符编码,你最好完全避免使用序号方法。
本文写于2019.7.8,历时1天
网友评论