gpt4 book ai didi

java - 使用来自不同类加载器的键的 EnumMap 的奇怪行为

转载 作者:行者123 更新时间:2023-12-02 00:50:24 25 4
gpt4 key购买 nike

我遇到了由不同类加载器加载的枚举类型的奇怪行为。在公共(public)库中,我有枚举定义(类似于以下内容):

enum MyEnumType { VAL_1, VAL_2, VAL_3 };

我有第一个应用程序,它创建以下 map 并将其注册为系统中的某种全局 map (为了简单起见,注册代码只是象征性的):

final Map<MyEnumType, String> map = new EnumMap<MyEnumType, String>(MyEnumType.class);
map.put(MyEnumType.VAL_1, "value 1");
map.put(MyEnumType.VAL_2, "value 2");
map.put(MyEnumType.VAL_3, "value 3");
GLOBAL_SYSTEM_MAP = Collections.unmodifiableMap(map);

第二个应用程序(具有不同的类加载器)执行以下操作:

String value = GLOBAL_SYSTEM_MAP.get(MyEnumType.VAL_1);

并接收空值。我使用调试器检查 GLOBAL_SYSTEM_MAP 是否正确,包含适当的值,但 get() 方法仍然没有返回任何正确的值。

我怀疑原因可能与两个应用程序用于加载 MyEnumType 类型的不同类加载器有关。但另一方面,枚举的 equals() 方法可能是为这种情况准备的,不是吗?那么,也许 EnumMap.get() 实现使用 == 而不是 equals() ? (但我相当怀疑)我也尝试用 HashMap 替换 EnumMap 但这也没有解决问题。

最佳答案

EnumMap 检查您传入的键的实际类与创建它所用的枚举的类。如果它们不同,get 将返回 null。该类将会有所不同,因为您使用不同的类加载器加载 MyEnum 类两次。

修复方法是安排两个应用程序使用 MyEnum 类的共享实例。

关于java - 使用来自不同类加载器的键的 EnumMap 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3459014/

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