Sie konnten die Function Schnittstelle in den Google-guava Bibliothek verwenden, um leicht zu erreichen, was Sie wollen:
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));
}
}
drucken Sollte:
Hinzufügen von 2 bis: 1
Hinzufügen von 2 zu: 2
Hinzufügen von 2 bis: 3
Hinzufügen von 2 bis: 4
können Sie, dass der zweite sehen Zeit memoizedAdd2 wird auf die Argumente 2 und 1, (.) angewendet Berechnung in der Anwendung ist nicht wirklich ausgeführt, es hat nur die gespeicherten Ergebnisse abgerufen.
Wie kann ich es als Dekorateur meiner Methode allgemein implementieren? – Albert
@Albert: Wie Benoit sagte, gibt es keine native Implementierung von diesem (d. H. Sie können dies nicht ohne Java-Hacking machen), da der Python-Decorator-Kram einige "Meta-Informationen" über die Funktion verwendet. I.e. In Python ist es möglich, dass der Dekorateur die ursprüngliche Funktion ändert. Dies ist - soweit ich weiß - in Java nicht möglich. – phimuemue
"Sie können es leicht implementieren, als Dekorateur Ihrer Methode." <- wie kann ich das als Dekorateur machen? Oder was meinst du damit? – Albert