Java单例-空静态变量(不能解释)

Java单例-空静态变量(不能解释),java,static,singleton,Java,Static,Singleton,有人能解释一下为什么方法get(…)会对输入ConfiguratorType.SKODA抛出非法状态异常(变量configurators包含{SKODA=null})?它怎么可能是空的,我不明白为什么SkodaConfigurator.INSTANCE返回空的。它不应该是空的,或者我弄错了?代码在servlet环境Java7中执行 多谢各位 public class CarConfigurators { private static Map<ConfiguratorType, C

有人能解释一下为什么方法get(…)会对输入ConfiguratorType.SKODA抛出非法状态异常(变量configurators包含{SKODA=null})?它怎么可能是空的,我不明白为什么SkodaConfigurator.INSTANCE返回空的。它不应该是空的,或者我弄错了?代码在servlet环境Java7中执行

多谢各位

public class CarConfigurators {

    private static Map<ConfiguratorType, CarConfigurator> configurators
          = new EnumMap<ConfiguratorType, CarConfigurator>(ConfiguratorType.class);

    static {
        configurators.put(ConfiguratorType.SKODA, SkodaConfigurator.INSTANCE);
        // ..
    }

    public static CarConfigurator obtain(ConfiguratorType type) {
        CarConfigurator configurator = configurators.get(type);
        if (configurator == null)
            throw new IllegalStateException("Car configurator of type " + type + " is not registered.");
        return configurator;
    }
   ...
}


public class SkodaConfigurator extends CarConfigurator {

     public static final SkodaConfigurator INSTANCE = new SkodaConfigurator();
     ...
}

public enum ConfiguratorType {
    SKODA,
    // ..
}
公共类配置器{
专用静态地图配置器
=新的EnumMap(ConfiguratorType.class);
静止的{
配置器.put(ConfiguratorType.SKODA,SkodaConfigurator.INSTANCE);
// ..
}
公共静态车辆配置器获取(配置类型){
CarConfigurator configurator=configurator.get(类型);
如果(配置器==null)
抛出新的IllegalStateException(“未注册“+type+”类型的车辆配置程序”);
返回配置器;
}
...
}
公共类SkodaConfigurator扩展了CarConfigurator{
公共静态最终SkodaConfigurator实例=新SkodaConfigurator();
...
}
公共枚举配置类型{
斯柯达,
// ..
}

静态代码不能全部同时运行,静态初始化的各个位必须按照给定的顺序进行。显然,在本例中,执行configurations.put(…)的静态块在SkodaConfiguration中的静态变量初始化之前运行

这与静态初始化顺序有关。 我从另一个答案中发现了这一点

public class Main {

    {
        System.out.printf("NON-STATIC BLOCK\n");
    }

    static{
        System.out.printf("STATIC BLOCK\n");
    }

    public static Main m = new Main();

    public Main(){
        System.out.printf("MAIN CONSTRUCTOR\n");
    }

    public static void main(String... args) {
        //Main m = new Main();
        System.out.printf("MAIN METHOD\n");

    }
}
输出:

STATIC BLOCK

NON-STATIC BLOCK

MAIN CONSTRUCTOR

MAIN METHOD

请仔细阅读:

请发布一个简短但完整的程序来演示问题。我们不知道您在这里声明的是哪个类,例如。。。我猜它实际上在
CarConfigurator
中,在这种情况下我可以解释它。您显示一个
CarConfigurators
(复数)类,然后
SkodaConfigurator
扩展
CarConfigurator
(单数)。我猜这只是一个输入错误,但只是想排除任何其他可能性(即还有一个
CarConfigurator
类)。如果是输入错误,请修复。这不是输入错误,CarConfigurator是创建不同CarConfigurator子类实例的工厂。您可以发布配置类型的代码吗?添加,这只是一个简单的枚举,我认为这是不可能的。请你再解释一下好吗?如果不看代码的其余部分,很难知道。例如,SkodaConfigurator或CarConfigurator中是否有其他代码执行引用CarConfigurator静态成员的静态初始化,或者SkodaConfigurator的构造函数中是否有其他代码?这意味着你有一个循环依赖,这可能会导致这类问题。如果你要做的只是在别处直接操作,最好在评论中发布链接。即使删除了链接,答案也应该能够独立存在。