usted podría utilizar la interfaz Function en la biblioteca de Google guava lograr fácilmente lo que está buscando:
import java.util.HashMap;
import java.util.Map;
import com.google.common.base.Function;
public class MemoizerTest {
/**
* Memoizer takes a function as input, and returns a memoized version of the same function.
*
* @param <F>
* the input type of the function
* @param <T>
* the output type of the function
* @param inputFunction
* the input function to be memoized
* @return the new memoized function
*/
public static <F, T> Function<F, T> memoize(final Function<F, T> inputFunction) {
return new Function<F, T>() {
// Holds previous results
Map<F, T> memoization = new HashMap<F, T>();
@Override
public T apply(final F input) {
// Check for previous results
if (!memoization.containsKey(input)) {
// None exists, so compute and store a new one
memoization.put(input, inputFunction.apply(input));
}
// At this point a result is guaranteed in the memoization
return memoization.get(input);
}
};
}
public static void main(final String[] args) {
// Define a function (i.e. inplement apply)
final Function<Integer, Integer> add2 = new Function<Integer, Integer>() {
@Override
public Integer apply(final Integer input) {
System.out.println("Adding 2 to: " + input);
return input + 2;
}
};
// Memoize the function
final Function<Integer, Integer> memoizedAdd2 = MemoizerTest.memoize(add2);
// Exercise the memoized function
System.out.println(memoizedAdd2.apply(1));
System.out.println(memoizedAdd2.apply(2));
System.out.println(memoizedAdd2.apply(3));
System.out.println(memoizedAdd2.apply(2));
System.out.println(memoizedAdd2.apply(4));
System.out.println(memoizedAdd2.apply(1));
}
}
debe imprimir:
Adición de 2 a: 1
Agregar 2 a: 2
Adición de 2 a: 3
Adición de 2 a: 4
Se puede ver que el segundo el tiempo memorizadoAdd2 se llama (aplicado) a los argumentos 2 y 1, el el cálculo en la aplicación no se ejecutó realmente, simplemente obtuvo los resultados almacenados.
¿Cómo puedo implementarlo de manera general como decorador de mi método? – Albert
@Albert: como dijo Benoit, no hay una implementación nativa de esto (es decir, no se puede hacer esto de forma general sin hackeo de Java), ya que las cosas de decodificador de Python utilizan cierta "metainformación" sobre la función. Es decir. es posible en Python dejar que el decorador altere la función original. Esto es, por lo que sé, imposible en Java. – phimuemue
"puede implementarlo fácilmente, como decorador de su método". <- ¿cómo puedo hacerlo como decorador? ¿O qué quieres decir con eso? – Albert