【发布时间】:2011-01-19 08:45:16
【问题描述】:
我正在研究一种(简单的)缓存解决方案,其中服务可以从缓存映射中请求缓存对象。 Cache 对象的工作原理本质上也类似于 Map,具有键和值以及访问和存储对象的方法。
我想出了以下解决方案,但正如您所见,它包含一个强制转换(因为 get() 无法知道嵌套对象的类型应该是什么)。
private final Map<String, Cache<?, ?>> caches = new HashMap<String, Cache<?, ?>>();
public <K, V> Cache<K, V> getOrCreateCache(String identifier) {
if (caches.containsKey(identifier)) {
return (Cache<K, V>) caches.get(identifier);
} else {
Cache<K, V> cache = new CacheImpl<K, V>();
caches.put(identifier, cache);
return cache;
}
}
private void test() {
Cache<String, String> strCache = getOrCreateCache("string cache");
strCache.set("key", "value");
}
现在,我的问题:
- 只要正确处理类转换异常,这是一种“安全”的方法吗? (可能会捕获这些并将它们打包到自定义异常类中)
- 是否有“安全”的替代方案?如果可能的话,使用泛型,因为我喜欢它们并且不喜欢演员表。
- (不直接相关)这是线程安全的吗?我假设不是,但是,我不是线程专家。仅使整个方法同步就足够了,还是(有六个客户端)会导致过多的开销/锁定?有没有一个巧妙的解决方案?
编辑:哇,很多答案,谢谢!在这里编辑以描述我在实际测试时发现的一个奇怪之处:
Cache<String, String> someCache = service.getOrCreateCache(cacheIdentifier);
someCache.set("asdf", "sdfa");
Cache<String, Integer> someCacheRetrievedAgain = service.getOrCreateCache(cacheIdentifier);
System.out.println(someCacheRetrievedAgain.get("asdf")); // prints "sdfa". No errors whatsoever. Odd.
【问题讨论】: