Sé de este http://onjava.com/pub/a/onjava/2003/08/20/memoization.html pero ¿hay algo más?¿Cuáles son las diferentes técnicas para la memorización en Java?
Respuesta
memoization es también fácil con una simple typesafe llanura de Java.
Puede hacerlo desde cero con las siguientes clases reutilizables.
Utilizo estos como cachés cuya vida útil es la solicitud en una aplicación web.
Por supuesto, use la Guava MapMaker
si necesita una estrategia de desalojo o más funciones como la sincronización.
Si necesita memorizar un método con muchos parámetros, simplemente coloque los parámetros en una lista con ambas técnicas, y pase esa lista como el parámetro único.
abstract public class Memoize0<V> {
//the memory
private V value;
public V get() {
if (value == null) {
value = calc();
}
return value;
}
/**
* will implement the calculation that
* is to be remembered thanks to this class
*/
public abstract V calc();
}
abstract public class Memoize1<P, V> {
//The memory, it maps one calculation parameter to one calculation result
private Map<P, V> values = new HashMap<P, V>();
public V get(P p) {
if (!values.containsKey(p)) {
values.put(p, calc(p));
}
return values.get(p);
}
/**
* Will implement the calculations that are
* to be remembered thanks to this class
* (one calculation per distinct parameter)
*/
public abstract V calc(P p);
}
Y esto se utiliza como esto
Memoize0<String> configProvider = new Memoize0<String>() {
@Override
public String calc() {
return fetchConfigFromVerySlowDatabase();
}
};
final String config = configProvider.get();
Memoize1<Long, String> usernameProvider = new Memoize1<Long, String>() {
@Override
public String calc(Long id) {
return fetchUsernameFromVerySlowDatabase(id);
}
};
final String username = usernameProvider.get(123L);
La guayaba todavía no está aprobada para nuestro entorno, el software financiero ... – ranv01
La guayaba todavía no está aprobada para nuestro medio ambiente. Software bancario ... Pero esto servirá. Sin embargo, limitaré el tamaño del mapa para evitar pérdidas de memoria. No me preocupan los desalojos, ya que esto se conservará solo durante la invocación de un método. – ranv01
Me gusta la forma en que el código altamente probado no está aprobado, pero algo pegado en SO es :) –
Ejemplo:
import java.math.BigInteger;
import com.google.common.base.Preconditions;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
public class Fibonacci {
private static final LoadingCache<Integer, BigInteger> CACHE
= CacheBuilder.newBuilder().build(CacheLoader.from(Fibonacci::fib));
public static BigInteger fib(int n) {
Preconditions.checkArgument(n >= 0);
switch (n) {
case 0:
return BigInteger.ZERO;
case 1:
return BigInteger.ONE;
default:
return CACHE.getUnchecked(n - 1).add(CACHE.getUnchecked(n - 2));
}
}
}
MapMaker ahora está en desuso en favor de CacheBuilder: https://code.google.com/p/guava-libraries/wiki/MapMakerMigration – dzieciou
@dzieciou Finalmente he actualizado el código a algo que funciona con la última guayaba (18.0 en hora actual de escritura). ¡Y esta vez, está probado! –
Para memoize funciones sin parámetros, el uso de guayaba Suppliers.memoize(Supplier)
. Para funciones con parámetros, use CacheBuilder.build(CacheLoader)
con objetos de valor de parámetro como claves.
- 1. ¿Cuáles son las últimas técnicas de DeBayer/Demosaicing?
- 2. Apple desaprueba Java, ¿cuáles son nuestras opciones técnicas como programadores?
- 3. ¿Cuáles son las limitaciones técnicas al usar Fusion Tables?
- 4. ¿Cuáles son las técnicas más utilizadas para habilitar las extensiones de código de usuario en Python?
- 5. ¿Cuáles son las diferentes plataformas para configurar Qt
- 6. ¿Cuáles son las técnicas para permitir actualizaciones de software seguras en sistemas integrados?
- 7. En SAS, ¿cuáles son las buenas técnicas/opciones para detectar errores de sintaxis?
- 8. ¿Cuáles son algunas técnicas para limitar las dependencias de compilación en proyectos de C++?
- 9. python: ¿cuáles son las técnicas eficientes para tratar datos profundamente anidados de manera flexible?
- 10. ¿Cuáles son las técnicas aceptadas para permanecer conectado a un sitio web?
- 11. ¿Cuáles son las diferentes maneras de reemplazar un cursor?
- 12. ¿Cuáles son los beneficios de las diferentes endiannesses?
- 13. ¿Cuáles son los diferentes enfoques para la replicación de sesiones de Java EE?
- 14. ¿Cuáles son las mejores prácticas en la reutilización de código entre diferentes proyectos de Ruby?
- 15. ¿Cuáles son las técnicas de optimización del compilador de C++ en Visual Studio
- 16. ¿Cuáles son algunas técnicas viables para combinar la protección CSRF con API RESTful?
- 17. ¿Cuáles son las ventajas de Blocking Queue en Java?
- 18. ¿Cuáles son las diferencias entre java 1.5 y java 1.6
- 19. ¿Para qué sirve la memorización y realmente es tan útil?
- 20. ¿Cuáles son las bibliotecas comunes para C?
- 21. ¿Cuáles son las herramientas ágiles para PHP?
- 22. Cuáles son las diferencias en JIT entre Java y .Net
- 23. ¿Cuáles son las reglas generales para comparar diferentes tipos de datos en C?
- 24. ¿Cuáles son tus esqueletos favoritos para los diferentes idiomas?
- 25. ¿Cuáles son las mejores técnicas de optimización de rendimiento de SQL Server?
- 26. ¿Cuáles son los pasos para depurar la aplicación web Java?
- 27. ¿Cuáles son algunos buenos complementos para desarrollar Java en VIM?
- 28. ¿Cuáles son las reglas para usar^para apuntar al valor?
- 29. ¿Cuáles son las diferencias en las diferentes clases de casos de prueba de Android?
- 30. ¿Cuáles son algunas buenas técnicas para convertir una aplicación de Ms Access a .Net Application?
Este ejemplo hace memoria sobre todos los métodos de un objeto a través de un proxy. Pero la memorización típica es una función en ese momento. Esa técnica de proxy sería molesta cuando no quieras memorizar todos los métodos de un objeto. – lacroix1547