当前位置:  开发笔记 > 编程语言 > 正文

为什么compareTo在Java上的Enum final?

如何解决《为什么compareTo在Java上的Enumfinal?》经验,为你挑选了3个好方法。

Java中的枚举实现了Comparable接口.这本来是很好的覆盖ComparablecompareTo方法,但在这里它被标记为最终.Enum's 的默认自然顺序compareTo是列出的顺序.

有谁知道为什么Java枚举有这个限制?



1> Zach Scriven..:

为了保持一致性我想......当你看到一个enum类型,你知道一个事实,即它的自然排序中的常量声明的顺序.

要解决此问题,您可以轻松创建自己的Comparator,并在需要不同的订购时使用它:

enum MyEnum
{
    DOG("woof"),
    CAT("meow");

    String sound;    
    MyEnum(String s) { sound = s; }
}

class MyEnumComparator implements Comparator
{
    public int compare(MyEnum o1, MyEnum o2)
    {
        return -o1.compareTo(o2); // this flips the order
        return o1.sound.length() - o2.sound.length(); // this compares length
    }
}

您可以Comparator直接使用:

MyEnumComparator c = new MyEnumComparator();
int order = c.compare(MyEnum.CAT, MyEnum.DOG);

或在集合或数组中使用它:

NavigableSet set = new TreeSet(c);
MyEnum[] array = MyEnum.values();
Arrays.sort(array, c);    

更多的信息:

枚举类型的Java教程

Sun的Enums指南

类Enum API


是的,它确实.新的MyEnumComparator.compare(enum1,enum2).Etvoilá.
@kbolino:比较器可能是enum类中的嵌套类。它可以存储在枚举的“ LENGTH_COMPARATOR”静态字段中。这样,对于使用枚举的任何人来说都很容易找到。

2> 小智..:

提供使用源代码排序的compareTo的默认实现很好; 让它最终成为Sun的一个失误.序数已经占据了申报单.我同意在大多数情况下,开发人员可以在逻辑上对其元素进行排序,但有时人们希望源代码的组织方式使可读性和维护成为最重要的.例如:

  //===== SI BYTES (10^n) =====//

  /** 1,000 bytes. */ KILOBYTE (false, true,  3, "kB"),
  /** 106 bytes. */   MEGABYTE (false, true,  6, "MB"),
  /** 109 bytes. */   GIGABYTE (false, true,  9, "GB"),
  /** 1012 bytes. */  TERABYTE (false, true, 12, "TB"),
  /** 1015 bytes. */  PETABYTE (false, true, 15, "PB"),
  /** 1018 bytes. */  EXABYTE  (false, true, 18, "EB"),
  /** 1021 bytes. */  ZETTABYTE(false, true, 21, "ZB"),
  /** 1024 bytes. */  YOTTABYTE(false, true, 24, "YB"),

  //===== IEC BYTES (2^n) =====//

  /** 1,024 bytes. */ KIBIBYTE(false, false, 10, "KiB"),
  /** 220 bytes. */   MEBIBYTE(false, false, 20, "MiB"),
  /** 230 bytes. */   GIBIBYTE(false, false, 30, "GiB"),
  /** 240 bytes. */   TEBIBYTE(false, false, 40, "TiB"),
  /** 250 bytes. */   PEBIBYTE(false, false, 50, "PiB"),
  /** 260 bytes. */   EXBIBYTE(false, false, 60, "EiB"),
  /** 270 bytes. */   ZEBIBYTE(false, false, 70, "ZiB"),
  /** 280 bytes. */   YOBIBYTE(false, false, 80, "YiB");

上面的顺序在源代码中看起来很好,但不是作者认为compareTo应该如何工作.所需的compareTo行为是按字节数排序.导致这种情况发生的源代码排序会降低代码的组织.

作为枚举的客户,我不在乎作者如何组织他们的源代码.但我确实希望他们的比较算法能够产生某种意义.Sun不必要地将源代码编写器置于绑定中.


同意,我希望我的枚举能够有一个类似的业务,而不是一个如果有人不注意就可以破坏的订单.

3> Martin OConn..:

枚举值根据声明的顺序在逻辑上精确排序.这是Java语言规范的一部分.因此,如果枚举值是同一枚举的成员,则只能进行比较.规范要进一步保证compareTo()返回的可比订单与声明值的顺序相同.这是枚举的定义.

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有