Странное поведение EnumMap с ключами от разных загрузчиков классов - PullRequest
0 голосов
/ 11 августа 2010

Я столкнулся со странным поведением типа 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, но это тоже не решило проблему.

Ответы [ 2 ]

2 голосов
/ 11 августа 2010

EnumMap проверяет фактический класс ключа, который вы передаете, с классом перечисления, с которым он был создан.Если они отличаются, get вернет ноль.Класс будет другим, так как вы загружаете класс MyEnum дважды с разными загрузчиками классов.

Исправление состоит в том, чтобы оба приложения использовали общий экземпляр класса MyEnum.

1 голос
/ 11 августа 2010

enum значения, загруженные другим загрузчиком классов, не должны быть == или equals. Обычно вы должны получить какую-то ошибку, если рассматриваете разные классы с одинаковыми именами из разных загрузчиков классов как одинаковые. Тип GLOBAL_SYSTEM_MAP Map<MyEnumType,String> или Map<?,String> (или аналогичный)?

Одной из возможных причин скрытия ошибки является то, что некоторые загрузчики классов сначала не делегируют своим родителям (IIRC, нарушает спецификацию Java SE, рекомендованную спецификациями EE). Это вызывает всевозможные проблемы.

...