문제

자바의 열거는 Comparable 상호 작용. 무시하는 것이 좋았을 것입니다 Comparable'에스 compareTo 방법이지만 여기서는 최종으로 표시됩니다. 기본 자연 순서 켜짐 Enum'에스 compareTo 나열된 순서입니다.

자바 열거가 왜이 제한을 가지고 있는지 아는 사람이 있습니까?

도움이 되었습니까?

해결책

일관성을 위해 나는 당신이 an을 볼 때 추측합니다 enum 유형, 당신은 알고 있습니다 사실 자연 순서는 상수가 선언되는 순서입니다.

이 작업을 해결하려면 쉽게 직접 만들 수 있습니다. Comparator<MyEnum> 다른 순서가 필요할 때마다 사용하십시오.

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

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

class MyEnumComparator implements Comparator<MyEnum>
{
    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<MyEnum> set = new TreeSet<MyEnum>(c);
MyEnum[] array = MyEnum.values();
Arrays.sort(array, c);    

추가 정보 :

다른 팁

소스 코드 순서를 사용하는 비교의 기본 구현을 제공하는 것은 정상입니다. 그것을 결승하게 만드는 것은 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");

위의 순서는 소스 코드에서는 좋아 보이지만 저자가 비교가 작동해야한다고 믿는 방법은 아닙니다. 원하는 비교 동작은 순서를 바이트 수에 의한 것입니다. 그러한 일이 발생하는 소스 코드 순서는 코드의 구성을 저하시킵니다.

열거의 클라이언트로서 나는 저자가 소스 코드를 어떻게 정리했는지 덜 신경 쓰지 못했습니다. 그래도 비교 알고리즘이 어떤 의미가 있기를 원합니다. Sun은 불필요하게 소스 코드 작성자를 바인드에 넣었습니다.

열거 값은 선언 된 순서에 따라 논리적으로 정확하게 주문됩니다. 이것은 Java 언어 사양의 일부입니다. 따라서 열거 값은 동일한 열거의 구성원 인 경우에만 비교할 수 있습니다. 사양은 비교 ()에 의해 반환 된 비교 순서가 값이 선언 된 순서와 동일하다는 것을 더 보장하고자한다. 이것은 열거의 정의입니다.

가능한 한 가지 설명은 그 것입니다 compareTo 일치해야합니다 equals.

그리고 equals 열거는 정체성 평등과 일치해야합니다 (==).

만약에 compareTo 비 결합 된 위치는 일치하지 않는 행동으로 그것을 무시할 수 있습니다. equals, 이것은 매우 반 직관적 일 것입니다.

열거적인 요소의 자연 순서를 변경하려면 소스 코드에서 순서를 변경하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top