Следует иметь в виду, что после инициализации статическая карта будет храниться в памяти неограниченное время;циклический подход будет содержать массив, созданный путем вызова values()
на время итерации цикла.
Однако стоит отметить, что использование класса-держателя не дает никаких преимуществ: потому что вы добавляетек карте в конструкторе, класс держателя будет сразу же инициализирован при вызове конструктора.
Таким образом, вы также можете использовать простое старое статическое (окончательное) поле.
Также стоит учитывать, что этот подход обязательно требует, чтобы карта была изменчивой.Вы не можете изменять его, но стоит изменить подход, так что вы не можете .
Вместо этого вы можете инициализировать непосредственно в поле:
static final Map<Integer, HttpStatus> map =
Collections.unmodifiableMap(
Stream.of(HttpStatus.values())
.collect(toMap(s -> s.value, s -> s)));
(или используйте что-то вроде Guava ImmutableMap
)
Еще один момент в подходе инициализации карты напрямую заключается в том, что она не добавляет к карте в конструкторе - что означает, что вы не используетена самом деле не нужно помещать это в сам класс enum.Это дает вам возможность использовать его в перечислениях, в которых у вас нет возможности изменить код, и / или добавлять карту только в те места, где вы обнаружили необходимость в производительности.