Я столкнулся со странным поведением типа enum, загруженного другим загрузчиком классов. В общей библиотеке у меня есть определение enum (аналогично следующему):
enum MyEnumType { VAL_1, VAL_2, VAL_3 };
У меня есть первое приложение, которое создает следующую карту и регистрирует ее как глобальную в системе (для простоты регистрационный код только символический):
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. Но с другой стороны, метод enum equals (), вероятно, подготовлен для такого случая, не так ли? Итак, может быть, реализация EnumMap.get () использует == вместо equals ()? (но я скорее сомневаюсь в этом) Я также пытался заменить EnumMap на HashMap, но это тоже не решило проблему.