2010-09-17 12 views
8

Mi sono imbattuto in questo answer in SO in cui è menzionato che le raccolte di Google MapMaker sono fantastiche. Ho esaminato la documentazione ma non sono riuscito a capire dove posso usarlo. Può indicare uno solo degli scenari in cui sarebbe appropriato usare MapMaker.Uso di MapMaker di Google raccolte?

+0

Vedere: http://stackoverflow.com/questions/3617680/can-someone-explain-to-me-when-it-is-useful-to-use-mapmaker-or-weakhashmaps – ColinD

risposta

12

Ecco un rapido esempio di un modo che ho usato MapMaker:

private final ConcurrentMap<Long, Foo> fooCache = new MapMaker() 
    .softValues() 
    .makeComputingMap(new Function<Long, Foo>() { 
      public Foo apply(Long id) { 
      return getFooFromServer(id); 
      } 
     }); 

public Foo getFoo(Long id) { 
    return fooCache.get(id); 
} 

Quando get(id) viene chiamato sulla mappa, che sarà sia restituire la Foo che è nella mappa per tale ID o' Lo recupererò dal server, lo metterà in cache e lo restituirà. Non devo pensarci una volta che è stato impostato. Inoltre, poiché ho impostato softValues(), la cache non può riempirsi e causare problemi di memoria poiché il sistema è in grado di cancellare le voci da esso in risposta alle esigenze di memoria. Se un valore memorizzato nella cache viene cancellato dalla mappa, tuttavia, è sufficiente chiedere nuovamente al server la prossima volta che ne ha bisogno!

Il fatto è che questo è solo un modo in cui può essere utilizzato. L'opzione per fare in modo che la mappa utilizzi chiavi e/o valori forti, deboli o morbidi, oltre all'opzione di rimuovere le voci dopo un determinato periodo di tempo, ti consente di fare molte cose con esso.

+0

Dovrebbe 'getFoo' e 'getFooFromServer' ha la stessa funzione qui? –

+0

@Tom: No, perché quando viene chiamato 'fooCache.get (id)', verrà chiamata la 'Funzione' della mappa di calcolo se il valore non è nella cache. Se la 'Funzione' ha chiamato' getFoo' di nuovo, proverebbe ancora una volta a chiamare 'fooCache.get'. Detto questo, il codice per 'getFooFromServer()' potrebbe essere definito proprio all'interno di 'Funzione' invece che come metodo separato ... Ho appena usato un metodo con nome per chiarire cosa fa la funzione senza dover scrivere alcun falso effettivo codice per chiamare il server. – ColinD

3

Può essere d'aiuto se si guardano le descrizioni di SoftReference e WeakReference.

SoftReference è molto utile per l'utilizzo in cache, in quanto verranno cancellati in modo specifico quando la memoria si sta esaurendo.

WeakReference indica al Garbage Collector che può raccogliere l'oggetto a cui fa riferimento fino a quando non ci sono riferimenti validi altrove. Questo viene in genere utilizzato con elementi che possono essere rapidamente rivisti se necessario.

Quindi, considerare l'utilizzo di MapMaker per creare una ConcurrentMap con softValues ​​per una cache e una con weakKeys per le tabelle di ricerca temporanee.

Modifica: softValues ​​utilizza una politica LRU.

Problemi correlati