高效Java技巧之不滥用枚举的下标

太过爱你忘了你带给我的痛 2022-09-10 08:11 235阅读 0赞

所有的枚举类型都有一个ordinal方法,将返回枚举值在枚举类中的位置。

  1. // 滥用下标,将下标与枚举值的属性特征联系在一起,应当避免这样做
  2. public enum Ensemble {
  3. SOLO, DUET, TRIO, QUARTET, QUINTET,
  4. SEXTET, SEPTET, OCTET, NONET, DECTET;
  5. public int numberOfMusicians() { return ordinal() + 1; }
  6. }

Ensemble这个枚举表示合奏,枚举值从独奏(SOLO)依次增加直到十重奏(DECTET),numberOfMusicians表示演奏的数目,正好是下标值加1。比如SOLO排在第一个,下标值为0,而演奏数目正好是1。这种方式非常取巧,但是可能给维护带来噩梦。如果给枚举值重新排序,numberOfMusicians方法的返回值就不再正确。如果有一个新的枚举值对应的演奏数目和已有的枚举值一样,比如double quartet(双重四重奏),和OCTET一样,也是8个演奏,就会造成问题。此外,如果有一个演奏数目与已有的并不连续,比如现在想在上面的枚举基础上加一个triple quartet(三重四重奏),由于演奏数目是12,要想增加这个枚举值,就得先加演奏数目为9、10、11的枚举值,而这本来很可能是完全不需要的。

永远不要将与枚举值有关的属性和它的下标相关联,而应该将属性值独立保存。

  1. public enum Ensemble {
  2. SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5),
  3. SEXTET(6), SEPTET(7), OCTET(8), DOUBLE_QUARTET(8),
  4. NONET(9), DECTET(10), TRIPLE_QUARTET(12);
  5. private final int numberOfMusicians;
  6. Ensemble(int size) { this.numberOfMusicians = size; }
  7. public int numberOfMusicians() { return numberOfMusicians; }
  8. }

实际上,在枚举的定义中,对ordinal这个方法进行了明确说明:

  1. 大部分编程人员不会用到这个方法,它是被设计来用于基于枚举的数据结构:EnumSetEnumMap

所以,除非你在编写这样的数据结构,最好不好使用ordinal这个方法。
欢迎扫描下方二维码关注微信公众号【谈谈IT】,第一时间获取最新文章。
欢迎关注同名公众号

发表评论

表情:
评论列表 (有 0 条评论,235人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java

    ine, 我写这个是因为在读Calendar的时候发现对枚举类(enum)的使用不熟悉。 使用原因 * 清晰明了。例如枚举类SeasonEnum表示的季节,它...

    相关 如何高效优雅使用java

    背景 枚举在系统中的地位不言而喻,状态、类型、场景、标识等等,少则十几个多则上百个,相信以下这段代码很常见,而且类似的代码到处都是,目标:消除这类冗余代码。 /

    相关 Java

    1.定义 enum 是一种数据类型,与 全局常量比较相似,都是全局的并且是可以通过类名调用的 与全局常量区别 枚举功能更强大,可以有属性和方法

    相关 Java使用技巧

    基本概念 枚举是JDK 1.5中引入的新特性。对应的关键字为enum。 其实枚举是一个特殊的类,这个类内部存储的是这个类的所有对象实例。 适用的场景 枚举一般适

    相关 java

    枚举 枚举(enum),是指一个经过排序的、被打包成一个单一实体的项列表。一个枚举的实例可以使用枚举项列表中任意单一项的值。枚举在各个语言当中都有着广泛的应用,通常用来表