从独立java类调用时的单例类行为
这个问题可能是一个非常基本的问题,但我想澄清一下。 我的需求是创建一个简单的缓存来存储和检索整个应用程序中的值从独立java类调用时的单例类行为,java,static,singleton,Java,Static,Singleton,这个问题可能是一个非常基本的问题,但我想澄清一下。 我的需求是创建一个简单的缓存来存储和检索整个应用程序中的值 public class CacheUtil { private static HashMap<String,Object> cacheMap = null; private static CacheUtil appCache =null; private CacheUtil() { cacheMap = new HashMa
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);
}
}
一旦设置了class1,class2就会尝试检索
CacheUtil cache = CacheUtil.getInstance();
cache.getFields("key1");
此时,缓存对象是不同的(由对象上的toString()方法检查),因此我总是在class2.java中获取key1的null
因此,想知道为什么我得到两个不同的对象,即使它被声明为带有静态修饰符的singleton?您确定没有其他线程覆盖“key1”值吗 尝试一下eager init。 Singleton类的实例是在类加载时创建的:
private static final CacheUtil instance = new CacheUtil();
private CacheUtil(){}
public static CacheUtil getInstance(){
return instance;
}
并将静态关键字删除到cacheMap:
private Map<String, Object> cacheMap;
私有映射缓存映射;
我认为,若您在声明时而不是在构造函数中初始化缓存映射,那个么问题将很容易解决
private static HashMap<String,Object> cacheMap = new HashMap<String,Object>();
private static HashMap cacheMap=new HashMap();
您是否在没有同步的情况下尝试过它?您不需要私有HashMap cacheMap=null;为什么不初始化我喜欢:private HashMap cacheMap=null代码>如何在构造函数内初始化静态字段?这难道不应该是违法的吗。。。。?首先从cacheMap
中删除static
关键字,然后尝试打印CacheUtil.class.hashCode()
的值,以检查您只有该类的一个实例。
private static HashMap<String,Object> cacheMap = new HashMap<String,Object>();