0

我正在使用 guava-libraries LoadingCache 来缓存我的应用程序中的类。

这是我想出的课程。

public class MethodMetricsHandlerCache {

  private Object targetClass;
  private Method method;
  private Configuration config;

  private LoadingCache<String, MethodMetricsHandler> handlers = CacheBuilder.newBuilder()
  .maximumSize(1000)
  .build(
      new CacheLoader<String, MethodMetricsHandler>() {
        public MethodMetricsHandler load(String identifier) {
          return createMethodMetricsHandler(identifier);
        }
      });


  private MethodMetricsHandler createMethodMetricsHandler(String identifier) {
  return new MethodMetricsHandler(targetClass, method, config);
 }

 public void setTargetClass(Object targetClass) {
  this.targetClass = targetClass;
 }

 public void setMethod(Method method) {
  this.method = method;
 }

 public void setConfig(Configuration config) {
  this.config = config;
 }

 public MethodMetricsHandler getHandler(String identifier) throws ExecutionException {
  return handlers.get(identifier);
 }

我正在使用这个类来缓存 MethodMetricsHandler

...
private static MethodMetricsHandlerCache methodMetricsHandlerCache = new MethodMetricsHandlerCache();

...
MethodMetricsHandler handler = getMethodMetricsHandler(targetClass, method, config);

private MethodMetricsHandler getMethodMetricsHandler(Object targetClass, Method method, Configuration config) throws ExecutionException {
 String identifier = targetClass.getClass().getCanonicalName() + "." + method.getName();
 methodMetricsHandlerCache.setTargetClass(targetClass);
 methodMetricsHandlerCache.setMethod(method);
 methodMetricsHandlerCache.setConfig(config);
 return methodMetricsHandlerCache.getHandler(identifier);
}    

我的问题:

这是否会创建一个以标识符为键的 MethodMetricHandler 类的缓存(之前没有使用过,所以只是一个健全性检查)。

还有更好的方法吗?鉴于如果我不缓存,对于给定的标识符,我将拥有多个相同 MethodMetricHandler 的实例(数百个)?

4

1 回答 1

0

是的,它确实创建了 MethodMetricsHandler 对象的缓存。这种方法通常还不错,但是如果您描述了您的用例,我可能会说更多,因为这种解决方案非常不寻常。您已经部分改造了工厂模式。

也想想一些建议:

  • 在运行 getHandler 之前需要调用 3 个设置器,这很奇怪
  • 由于“配置”不在键中,因此您将从缓存中获取相同的对象以获得不同的配置以及相同的目标类和方法
  • 为什么 targetClass 是一个Object. 你可能想通过Class<?>
  • 你打算从缓存中驱逐对象吗?
于 2013-08-23T09:47:31.380 回答