gpt4 book ai didi

java - 在构造函数中使用时,通过工厂方法延迟实例化常量会引发错误

转载 作者:行者123 更新时间:2023-12-02 07:57:13 25 4
gpt4 key购买 nike

当构造函数使用对正在延迟实例化的常量的引用时,java 会抛出 ExceptionInInitializerError (特别是在“this(ClassA.INSTANCE1)”行上)。

public class ClassA {
public static final ClassA INSTANCE1 = get("INSTANCE1");
public static final ClassA INSTANCE2 = get("INSTANCE2");

private static final Map<String, ClassA> MULTITON_MAP = new HashMap<String, ClassA>();

private String name;

private ClassA(String name) {
this.name = name;
}

public static ClassA get(String name) {
ClassA toReturn = MULTITON_MAP.get(name);
if (toReturn == null) {
toReturn = new ClassA(name);
MULTITON_MAP.put(name, toReturn);
}
return toReturn;
}
}

public class ClassB {
private ClassA type;

public ClassB() {
this(ClassA.INSTANCE1);
}

public ClassB(ClassA type) {
this.type = type;
}

public static void main(String[] args) {
new ClassB();
}
}

我通过删除惰性实例化并将实例化移动到静态 block 中解决了这个问题。

public class ClassA {
public static final ClassA INSTANCE1;
public static final ClassB INSTANCE2;

...

static {
INSTANCE1 = new ClassA("INSTANCE1");
INSTANCE2 = new ClassA("INSTANCE2");

MULTITON_MAP.put("INSTANCE1", INSTANCE1);
MULTITON_MAP.put("INSTANCE2", INSTANCE2);
}

...
}

所以,我的问题是,为什么 Java 无法处理我之前所做的事情。导致错误的原因是什么?

非常感谢!

最佳答案

我认为您的问题是您尝试在 MULTITON_MAP 之前初始化 INSTANCE1,但 INSTANCE1 的实例化取决于 MULTITON_MAP .

例如当您在 get 中调用 MULTITON_MAP.get(name); 时,MULTITON_MAP 仍然为 null。

关于java - 在构造函数中使用时,通过工厂方法延迟实例化常量会引发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9454171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com