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


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

public enum SOME_ENUM {
  EN_ONE,
  EN_TWO,
  EN_THREE;
}

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

4 91

4 ответа:

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

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

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

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

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

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

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

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

другие ответы хороши, но не прокомментировать это:

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

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

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