В дополнение к ответу Кена, если создание тяжеловесного объекта, который позже будет выброшен, НЕ приемлемо (по какой-то причине вы хотите гарантировать, что для каждого ключа создается только один объект), тогда вы можете сделать это... на самом деле, не. Не делай этого сам. Используйте коллекции Google (теперь гуава) класс MapMaker:
Map<KeyType, HeavyData> cache = new MapMaker<KeyType, HeavyData>()
.makeComputingMap(new Function<KeyType, HeavyData>() {
public HeavyData apply(KeyType key) {
return new HeavyData(key); // Guaranteed to be called ONCE for each key
}
});
Тогда простой cache.get(key)
просто работает и полностью избавляет вас от необходимости беспокоиться о сложных аспектах параллелизма и синхронизации.
Обратите внимание, что если вы хотите добавить некоторые более интересные функции, такие как истечение срока действия, это просто
Map<....> cache = new MapMaker<....>()
.expiration(30, TimeUnit.MINUTES)
.makeComputingMap(.....)
и вы также можете легко использовать мягкие или слабые значения для ключей или данных, если это необходимо (см. Javadoc для более подробной информации)
person
Cowan
schedule
15.01.2010