Pregunta

El ejemplo estándar para implementar LRU Cache en Java apunta a la url de ejemplo de depósito http://www.exampledepot.com/egs/java.util/coll_Cache. html

¿Cómo se llama removeEldestEntry de manera predeterminada después de agregar una nueva entrada en el fragmento de código a continuación?

final int MAX_ENTRIES = 100;
Map cache = new LinkedHashMap(MAX_ENTRIES+1, .75F, true) {
    // This method is called just after a new entry has been added
    public boolean removeEldestEntry(Map.Entry eldest) {
        return size() > MAX_ENTRIES;
    }
};

// Add to cache
Object key = "key";
cache.put(key, object);

// Get object
Object o = cache.get(key);
if (o == null && !cache.containsKey(key)) {
    // Object not in cache. If null is not a possible value in the cache,
    // the call to cache.contains(key) is not needed
}

// If the cache is to be used by multiple threads,
// the cache must be wrapped with code to synchronize the methods
cache = (Map)Collections.synchronizedMap(cache);
¿Fue útil?

Solución

En este ejemplo, el LinkedHashMap se está extendiendo con un " clase interna anónima " .

El método removeEldestEntry anula la versión de la superclase, que siempre devuelve false (lo que indica que la entrada más antigua no debe eliminarse). La versión superior devuelve true si el tamaño del mapa excede el límite, lo que indica que la entrada más antigua debe eliminarse.

Otros consejos

Por el API de Java para LinkedHashMap :

  

El método removeEldestEntry (Map.Entry) puede anularse para imponer una política para eliminar automáticamente las asignaciones obsoletas cuando se agregan nuevas asignaciones al mapa.

Específicamente:

  

Este método es invocado por put y putAll después de insertar una nueva entrada en el mapa.

También tenga en cuenta:

  

Este método generalmente no modifica el mapa de ninguna manera, sino que permite que el mapa se modifique a sí mismo según lo indique su valor de retorno. Se permite que este método modifique el mapa directamente, pero si lo hace, debe devolver falso (lo que indica que el mapa no debe intentar ninguna otra modificación). Los efectos de devolver verdadero después de modificar el mapa desde este método no están especificados.

La documentación de la clase LinkedHashMap indica que llamará al método removeEldestEntry () en los momentos apropiados. En el código anterior proporcionamos un anónimo "se extiende" de la clase LinkedHashMap que proporciona explícitamente nuestra implementación para ese método.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top