Además de la respuesta de Ken, si la creación de un objeto pesado que luego se desecha NO es aceptable (desea garantizar que solo se crea un objeto para cada tecla, por algún motivo), puede hacerlo ... .. en realidad, no. No lo hagas tú mismo. Utilice la google-collections (ahora guava) MapMaker class:
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
}
});
A continuación, un simple cache.get(key)
solo funciona y completamente se quita de tener que preocuparse acerca de los aspectos difíciles de concurrencia y syncrhonization.
Tenga en cuenta que si quieres añadir algunas características más elegantes, como caducidad, es sólo
Map<....> cache = new MapMaker<....>()
.expiration(30, TimeUnit.MINUTES)
.makeComputingMap(.....)
y también se puede utilizar fácilmente los valores blandos o débiles, ya sea para las llaves o los datos si es necesario (consulte el Javadoc para obtener más detalles)
Solo me pregunto: ¿cuáles son realmente sus requisitos para el almacenamiento en caché? ¿Necesita almacenar en caché el cierre transitivo completo de su objeto pesado para que sea uniforme en todo el clúster de los servidores de su aplicación? Si es así, este es un problema no trivial que resolver, y es mejor que uses una biblioteca de caché como ehcache. – Alan