enum.values ​​() - порядок детерминированных возвращаемых перечислений - PullRequest
95 голосов
/ 29 сентября 2010

У меня есть перечисление SOME_ENUM:

public enum SOME_ENUM {
  EN_ONE,
  EN_TWO,
  EN_THREE;
}

Будет ли SOME_ENUM.values() всегда возвращать перечисления в порядке объявлений перечисления: EN_ONE, EN_TWO, EN_THREE?Это правило, или оно не гарантировано не будет изменено в следующих выпусках JDK?

Ответы [ 4 ]

135 голосов
/ 29 сентября 2010

Спецификация языка Java использует этот явный язык:

@ возвращает массив, содержащий константы этого типа перечисления, в порядке их объявления [Source]

Итак, да, они будут возвращены в порядке декларирования.Стоит отметить, что со временем порядок может измениться, если кто-то изменит класс, поэтому будьте очень осторожны с тем, как вы его используете.

16 голосов
/ 29 сентября 2010

Да, гарантированно вернуть их в таком порядке.

Однако следует избегать полагаться на это и на значение ordinal(), поскольку оно может измениться, например, после вставки новых элементов.

9 голосов
/ 29 сентября 2010

Это определяется порядком, в котором ваши значения объявлены. Однако, нет никакой гарантии, что вы (или кто-то еще) не будете переупорядочивать / вставлять / удалять значения в будущем .Так что не стоит полагаться на порядок.

Эффективная Java 2-я.Редакция посвящает свой пункт 31 тесно связанной теме: Используйте поля экземпляров вместо ординалов :

Никогда не получайте значение, связанное с перечислением, из его порядкового номера;вместо этого сохраните его в поле экземпляра.

7 голосов
/ 13 августа 2012

Другие ответы хороши, но не комментируйте это:

"Является ли это правилом или оно не гарантировано не будет изменено в следующем JDK выпускает? "

Я не верю, что гарантии на будущие JDK существуют, поэтому вам даже не стоит о них беспокоиться. Не будет никакого способа обеспечить их соблюдение, будущие руководители JDK могут просто решить отказаться от таких гарантий. Это похоже на Вестминстерскую систему парламента: «Ни один парламент не может связать будущий парламент».

Тем не менее, история JDK показывает превосходную последовательность. Они не вносят много критических изменений, поэтому вы можете быть уверены, что текущее указанное (не только наблюдаемое) поведение будет сохранено.

...