Java 为什么这个静态变量有时在类中为null?

Java 为什么这个静态变量有时在类中为null?,java,android,Java,Android,我定义了这个代码 public class AAA { public static final Map<String, String> gList = new HashMap<> {{ put("xxx", "xxx"); put .... }}; public static AAA instance; public static AAA getInstance() { if (instanc

我定义了这个代码

public class AAA {
    public static final Map<String, String> gList = new HashMap<> {{
        put("xxx", "xxx");
        put ....
    }};
    public static AAA instance;
    public static AAA getInstance() {
        if (instance == null)
            instance = new AAA();
        return instance;
    }

    public String calledFunc(String k) {
        return gList.get(k);    
    }
}

public class BBB {
    ...
    public void callingFunc(String k) {
        AAA.getInstance().calledFunc(k);  // <=  NULL pointer some time
    }
}
公共级AAA{
公共静态最终映射gList=新HashMap{{
卖出(“xxx”、“xxx”);
放。。。。
}};
公共静态AAA实例;
公共静态AAA getInstance(){
if(实例==null)
实例=新的AAA();
返回实例;
}
公共字符串calledFunc(字符串k){
返回gList.get(k);
}
}
公共类BBB{
...
public void callingFunc(字符串k){

AAA.getInstance().calledFunc(k);//前一段时间,我尝试过做类似的事情来在类之间保存数据,最终我使用了

试试这样的吧

public enum AAA {
    INSTANCE;
    public static final Map<String, String> gList = new HashMap<> {{
        put("xxx", "xxx");
        put ....
    }};
    public String calledFunc(String k) {
        return gList.get(k);
    }
}
公共枚举AAA{
实例;
公共静态最终映射gList=新HashMap{{
卖出(“xxx”、“xxx”);
放。。。。
}};
公共字符串calledFunc(字符串k){
返回gList.get(k);
}
}
如果您这样做了,您就不需要枚举中的函数,因为您可以这样做

public class BBB {
    ...
    public void callingFunc(String k) {
        AAA.gList.get(k);  // <=  NULL pointer some time
    }
}
公共类BBB{
...
public void callingFunc(字符串k){

AAA.gList.get(k);//您没有声明
实例的类型
。您需要同步getInstance()方法。非常好的一点。它将只保证一个实例。它还将通过强制执行必要的内存模型约束来解决问题。这是我在java中非常困惑的部分,使用枚举。那么枚举和类之间有什么区别呢?初始化的方法是什么?使用枚举时,只允许创建一个实例,这就是通常在启动程序时执行。类和枚举之间的区别在于类可以多次实例化(xxx=new AAA();)除非您特别指定,否则您只能创建一个实例。简单来说,枚举只是一种更干净、更简单的方法,可以创建一个类的单个实例,用于跨其他类共享数据、信息甚至方法。(这是我的理解,但在某些方面我可能是错的)感谢您的解释。可能还有更多,但这是最重要的想法。以下是您可以查看的内容;它提供了一些有关枚举的重要信息: