Каков наилучший способ кэширования и повторного использования неизменяемых одноэлементных объектов в Java? - PullRequest
1 голос
/ 24 августа 2010

У меня есть класс, представляющий набор значений, которые будут использоваться в качестве ключа в картах.

Этот класс неизменен, и я хочу сделать его единичным для каждого отдельного набора значений, используя статическийфабричный образец.Цель состоит в том, чтобы предотвратить создание идентичных объектов много раз (100+) и оптимизировать метод equals.

Я ищу лучший способ кэширования и повторного использования предыдущих экземпляров этого класса.Первое, что приходит на ум, - это простая хэш-карта, но есть ли альтернативы?

Ответы [ 3 ]

4 голосов
/ 24 августа 2010

Есть две ситуации:

  • Если количество различных объектов мало и фиксировано, вы должны использовать enum
    • Они не могут быть созданы вне заявленных констант, и EnumMap оптимизировано для этого
  • В противном случае вы можете кэшировать неизменяемые экземпляры, как вы планировали:
    • Если значения индексируются числами в непрерывном диапазоне, то можно использовать массив
      • Вот как, например, Integer экземпляров кэша в заданном диапазоне для valueOf
    • В противном случае вы можете использовать что-то вроде Map

В зависимости от модели использования, вы можете выбрать кэширование, скажем, последних N экземпляров вместо всех созданных на данный момент экземпляров. Этот подход используется, например, в re.compile в модуле регулярных выражений Python. Если N достаточно мало (например, 5), тогда простой массив с линейным поиском также может работать очень хорошо.

Для решения на основе Map, возможно, полезная реализация - java.util.LinkedHashMap, которая позволяет вам применять политики, подобные LRU, если вы @Override removeEldestEntry.

Существует также LRUMap из Apache Commons Collections , которые реализуют эту политику более непосредственно.

Смотри также

Смежные вопросы

2 голосов
/ 24 августа 2010

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

Хранение их на карте какого-то рода - действительно распространенная реализация.

0 голосов
/ 24 августа 2010

Как выглядят ваши объекты? Если ваши объекты довольно просты, я думаю, вам следует не кэшировать их - создание объектов обычно происходит довольно быстро. Я думаю, вы должны оценить, стоит ли, возможно, небольшого повышения производительности дополнительной сложности и усилий кеша.

...