Oltre alla risposta di Ken, se la creazione di un oggetto pesante che successivamente viene gettato via NON è accettabile (si desidera garantire che solo un oggetto venga creato per ogni chiave, per qualche motivo), è possibile farlo tramite .. .. in realtà, no. Non farlo da solo Utilizzare il google-collections (ora 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
}
});
Poi un semplice cache.get(key)
solo funziona e completamente si rimuove dal doversi preoccupare di aspetti difficili della concorrenza e syncrhonization.
Si noti che se si desidera aggiungere alcune caratteristiche più elaborate, come la scadenza, è solo
Map<....> cache = new MapMaker<....>()
.expiration(30, TimeUnit.MINUTES)
.makeComputingMap(.....)
e si può anche usare facilmente valori soft o deboli sia per le chiavi o dati se necessario (consultare Javadoc per più dettagli)
Basta chiedersi: quali sono i requisiti per il caching? È necessario memorizzare nella cache la chiusura transitiva completa dell'oggetto pesante in modo che sia coerente nel cluster dei server delle applicazioni? Se è così, questo è un problema non banale da risolvere, e potrebbe essere meglio usare una libreria cache come ehcache. – Alan