从独立java类调用时的单例类行为

时间:2015-11-03 14:53:46

标签: java static singleton

这个问题可能非常基础。但是想澄清一下。 我的要求是创建一个简单的缓存来存储和检索我的应用程序中的值。所以我创建了一个单独的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?

2 个答案:

答案 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;