2012-06-28 5 views
22

Недавно я узнал о преимуществах EnumMap на Java и хотел бы заменить существующий ImmutableMap<OccupancyType, BigDecimal> на EnumMap. Тем не менее, мне также понравится непреложная недвижимость, предлагаемая ImmutableMap.Есть ли соответствующая неизменяемая enumMap в guava?

  • Есть ли вариант, ImmutableEnumMap доступен в guava?
  • С точки зрения хранения, который один (EnumMap vs ImmutableMap) работает лучше?
  • Не удалось найти сравнение двух. Я был бы признателен, если кто-то может указать мне на ссылку или дать представление о эффективности двух структур данных?

ответ

30

Guava contributor здесь.

В настоящее время у Guava нет варианта ImmutableEnumMap, но если бы это было так, то это, скорее всего, было бы оберткой вокруг EnumMap. (Тем не менее, возможны несколько более надежных реализаций.)

EnumMap будет работать лучше, чем базовый ImmutableMap, в любом случае; это сложно или невозможно победить.

(я буду file an issue исследовать добавление ImmutableMap вариант для ключевых перечисляемых типов, однако.)


Update: Гуава 14 добавляет Maps.immutableEnumMap().

+0

Благодаря. Было бы у вас сравнение двух удобных? – brainydexter

+1

Я имею в виду, что не существует точно определенной метрики, с помощью которой можно сравнивать их, но могу сказать, что 'ImmutableMap' немного лучше, чем' HashMap', поэтому 'EnumMap' должен бить оба примерно одинаковым коэффициентом. –

+12

Обновление: 'ImmutableEnumMap' [был добавлен.] (Http://code.google.com/p/guava-libraries/source/detail?r=835a7397fabb05a764a8008f4151c97f821a29ef) –

10

Я просто хотел представить пример, который 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" 
     )); 

Не уверен, есть ли более естественный синтаксис.

+2

В этом вызове 'Maps.immutableEnumMap' вы можете использовать конструкцию' ImmutableMap. (). (MyEnum.A, "A"). Build() ', чтобы добавить к карте более 5 значений. – drvdijk

1

Поскольку guava ImmutableEnumMap по-прежнему отмечен бета-версией версии 14, я бы предложил использовать немодифицируемый вид карты перечисления и затем выбросить исходную ссылку на карту перечисления, чтобы гарантировать ее неизменность.

Пример (в конструкторе):

Map entries = new EnumMap <SomeEnum, T>(SomeEnum.class); 
... // (fill in entries) 
this.entries = Collections.unmodifiableMap(entries);