Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从独立java类调用时的单例类行为_Java_Static_Singleton - Fatal编程技术网

从独立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>();