Я использую guava-библиотеки LoadCache для кэширования классов в моем приложении.Использование guava-библиотек LoadingCache для кэширования java pojo
Вот класс, который я придумал.
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 для данного идентификатора, если я не кеширую?
Я знаю очень уникальный и нечетный случай. Библиотека в основном проверяет метаданные класса каждый раз, когда класс запускается в приложении. Кэш будет жить в течение всего срока службы приложения, поэтому могут быть n invocations, поэтому n объектов MethodMetricsHandler, если я не кэширую. Классы, которые входят в экземпляр метода MethodMetricsHandler, не могут быть изменены. Однако я вижу проблему с сеттерами, так как это будет работать в многопоточной среде. Любые предложения по изменению дизайна, чтобы сделать его потокобезопасным? – MWright