这个问题可能非常基础。但是想澄清一下。 我的要求是创建一个简单的缓存来存储和检索我的应用程序中的值。所以我创建了一个单独的java类,它有hashmap来存储和检索值。
public class CacheUtil {
private static HashMap<String,Object> cacheMap = null;
private static CacheUtil appCache =null;
private CacheUtil() {
cacheMap = new HashMap<String,Object>();
}
public static synchronized CacheUtil getInstance() {
if(appCache == null) {
appCache = new CacheUtil();
}
return appCache;
}
public Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
public void setFields(String key,HashMap<String,String> map) {
cacheMap.put(key, map);
}
public HashMap<String,String> getFields(String key) {
return (HashMap<String, String>) cacheMap.get(key);
}
}
我还有2个独立的java类class1.java&amp; class2.java。
class1.java正在设置缓存
CacheUtil cache = CacheUtil.getInstance();
cache.setFields("key1",value);
设置class1后,class2正在尝试检索
CacheUtil cache = CacheUtil.getInstance();
cache.getFields("key1");
此时缓存对象不同(通过对象上的toString()方法检查)所以我总是在class2.java中获取key1的null。
所以想知道我得到2个不同对象的原因是什么,即使它用static修饰符声明为singleton?
答案 0 :(得分:2)
我认为只要在声明时而不是在构造函数中初始化缓存映射,问题就会解决。
private static HashMap<String,Object> cacheMap = new HashMap<String,Object>();
答案 1 :(得分:1)
您确定没有其他线程覆盖&#34; key1&#34;值?
尝试eager init。 Singleton类的实例是在类加载时创建的:
private static final CacheUtil instance = new CacheUtil();
private CacheUtil(){}
public static CacheUtil getInstance(){
return instance;
}
并将static关键字删除到cacheMap:
private Map<String, Object> cacheMap;