Есть ли соответствующая неизменяемая enumMap в guava?
Недавно я узнал о преимуществах EnumMap на Java и хотел бы заменить существующий ImmutableMap<OccupancyType, BigDecimal>
на EnumMap. Тем не менее, мне также понравится неизменяемое свойство, предлагаемое ImmutableMap.
- Есть ли вариант, ImmutableEnumMap доступен в guava?
- С точки зрения хранения, который один (EnumMap vs ImmutableMap) работает лучше?
- Я не мог найти сравнение этих двух. Я был бы признателен, если бы кто-то мог указать мне ссылку или дать представление о эффективности двух структур данных?
Ответы
Ответ 1
Гуава здесь.
В настоящее время у Guava нет варианта ImmutableEnumMap
, но если бы это произошло, это, скорее всего, было бы оберткой вокруг EnumMap
. (Тем не менее, возможны несколько более надежных реализаций.)
EnumMap
будет работать лучше, чем базовый ImmutableMap
, в любом случае; это трудно или невозможно превзойти.
(Я создаст проблему, чтобы исследовать добавление варианта ImmutableMap
для типов ключей перечисления.)
Обновление: Guava 14 добавляет Maps.immutableEnumMap()
.
Ответ 2
Мне просто нужно было привести пример, когда ImmutableEnumMap
находится в Guava 14.0, потому что это пакет-частный класс, поэтому вы не можете сделать ImmutableEnumMap.of()
. Вы должны сделать Maps.immutableEnumMap()
вместо этого.
private final ImmutableMap<MyEnum, String> myEnumMap = Maps.immutableEnumMap(ImmutableMap.of(
MyEnum.A, "A",
MyEnum.B, "B",
MyEnum.C, "C"
));
Не уверен, есть ли более естественный синтаксис.
Ответ 3
Поскольку guava ImmutableEnumMap по-прежнему отмечен как бета-версия версии 14, я бы предложил использовать немодифицируемый вид карты перечисления и затем отбросить исходную ссылку на карту перечисления, чтобы гарантировать ее неизменность.
Пример (в конструкторе):
Map entries = new EnumMap <SomeEnum, T>(SomeEnum.class);
... // (fill in entries)
this.entries = Collections.unmodifiableMap(entries);