【发布时间】:2020-05-07 07:22:39
【问题描述】:
我想用 Java 编写一个用于一般记忆的实用程序,我希望代码看起来像这样:
Util.memoize(() -> longCalculation(1));
在哪里
private Integer longCalculation(Integer x) {
try {
Thread.sleep(1000);
} catch (InterruptedException ignored) {}
return x * 2;
}
为此,我想我可以这样做:
public class Util{
private static final Map<Object, Object> cache = new ConcurrentHashMap<>();
public interface Operator<T> {
T op();
}
public static<T> T memoize(Operator<T> o) {
ConcurrentHashMap<Object, T> memo = cache.containsKey(o.getClass()) ? (ConcurrentHashMap<Object, T>) cache.get(o.getClass()) : new ConcurrentHashMap<>();
if (memo.containsKey(o)) {
return memo.get(o);
} else {
T val = o.op();
memo.put(o, val);
return val;
}
}
}
我原以为这会起作用,但我发现没有做任何记忆。我已经追踪到o.getClass() 每次调用都不同。
我在想我可以尝试获得T 的运行时类型,但我想不出办法。
【问题讨论】: