[java] enum.values ​​()-결정적인 반환 된 열거 형의 순서입니다.

열거 형이 있습니다 SOME_ENUM.

public enum SOME_ENUM {
  EN_ONE,
  EN_TWO,
  EN_THREE;
}

SOME_ENUM.values()항상 열거 형 선언의 순서로 열거를 돌려 :
EN_ONE, EN_TWO, EN_THREE? 규칙입니까 아니면 다음 JDK 릴리스에서 변경되지 않을 것이라는 보장이 없습니까?



답변

Java 언어 사양은 다음과 같은 명시 적 언어를 사용합니다.

@이 열거 형의 상수를 포함하는 배열을 선언 된 순서대로 반환합니다. [Source]

예, 신고 순서대로 반환됩니다. 누군가가 클래스를 변경하면 시간이 지남에 따라 순서가 변경 될 수 있으므로이를 사용하는 방법에 대해 매우주의해야합니다.


답변

예, 그 순서대로 반품하는 것이 보장됩니다.

그러나 ordinal()예를 들어 새 항목을 삽입 한 후 변경 될 수 있으므로 해당 값 과 값 에 의존하지 않아야합니다 .


답변

값이 선언 된 순서에 따라 결정됩니다. 그러나 사용자 (또는 다른 사람)가 향후 값을 재정렬 / 삽입 / 제거하지 않을 것이라는 보장은 없습니다 . . 따라서 주문에 의존해서는 안됩니다.

효과적인 Java 2nd. Edition은 항목 31을 밀접하게 관련된 주제에 바칩니다 : 서수 대신 인스턴스 필드 사용 :

서수에서 열거 형과 관련된 값을 파생하지 마십시오. 대신 인스턴스 필드에 저장하십시오.


답변

다른 답변은 좋지만 이에 대해 언급하지 마십시오.

“규칙입니까 아니면 다음 Jdk 릴리스에서 변경되지 않을 것이라는 보장이 없습니까?”

미래의 JDK에 대한 보증이 존재한다고 생각하지 않으므로 걱정하지 마십시오. 그들을 강제 할 방법이 없을 것이며, 미래의 JDK 리드는 그러한 보증을 포기하기로 결정할 수도 있습니다. 그것은 웨스트 민스터 의회 시스템과 같습니다. “어떤 의회도 미래의 의회를 묶을 수 없습니다.”

즉, JDK의 역사는 뛰어난 일관성을 보여줍니다. 그들은 많은 주요 변경 사항을 만들지 않으므로 현재 지정된 (관찰 된 것이 아니라) 동작이 보존 될 것이라고 확신 할 수 있습니다 .


답변