Enum.values ​​() - порядок возвращаемых перечислений, детерминированный

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

public enum SOME_ENUM {
  EN_ONE,
  EN_TWO,
  EN_THREE;
}

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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