(SonarQube) LinkedHashMap и S1640 (говорит вам использовать EnumMap)

Я могу что-то упустить, но объявление LinkedHashmap:

private final LinkedHashMap<anEnum, anInteger> linkedHashMap;

и позже:

linkedHashMap = new LinkedHashMap<anEnum, anInteger>();

приводит к:

«Карты с ключами, которые являются значениями перечисления, должны быть заменены на EnumMap» (SQUID: 1640)

Поскольку «LinkedEnumMap» отсутствует, это объявление следует игнорировать.


person Tester    schedule 21.07.2017    source источник
comment
Почему бы вам не проверить их базу данных ошибок? Эта часть вашего вопроса не имеет особого смысла...   -  person GhostCat    schedule 21.07.2017


Ответы (2)


Дело в том, что использование EnumMap является хорошей практикой, поэтому SonarQube говорит вам об этом.

Но вы явно решили использовать LinkedHashMap, который отслеживает порядок вставки.

Таким образом, это сообщение можно интерпретировать как:

  • когда вы заботитесь только о сопоставлении перечислений, используйте EnumMap
  • когда вам нужно отобразить перечисления и позаботиться о порядке вставки, вы должны остаться с обычным LinkedHashMap

Другими словами: имейте в виду, что такие инструменты — это всего лишь инструменты. Они предоставляют сообщения, которые помогают вам принимать обоснованные решения. Когда вы решили, что ваша текущая реализация в порядке - тогда не меняйте свой код только потому, что какой-то инструмент выдает такие "советы".

person GhostCat    schedule 21.07.2017
comment
Очень правильно. Для некоторых Сонар — это библия. Но на самом деле это не так. Это очень хороший инструмент, но мы всегда должны уравновешивать проблему, которая возникает, поскольку она может быть неуместной. - person davidxxx; 21.07.2017

Специализированная реализация карты для использования с ключами типа enum. Все ключи в карте перечисления должны исходить из одного типа перечисления, который указывается явно или неявно при создании карты. Карты Enum внутренне представлены в виде массивов. Это представление чрезвычайно компактно и эффективно.

-- Документация

В принципе, это не ошибка, это хорошая рекомендация. Каждый Enum имеет свой порядок, который исходит из порядка объявления. Вы можете увидеть это в массиве, который возвращает values().

EnumMap сохраняет этот порядок и фактически сохраняет значения в массиве.

С другой стороны, вы можете решить, какая коллекция лучше для ваших целей. Я считаю, что сочетание EnumMap и List может быть вам интересно, но помните, что Sonar — это всего лишь намек. Вы можете перенастроить свой сонар и указать, чтобы он не показывал этот случай.

person xenteros    schedule 21.07.2017
comment
Я согласен на использование EnumMaps, но мой список предварительно отсортирован. Он должен сохранять состояние сортировки. Мне нужна LinkedHashMap. Я думаю, что рекомендовать что-то невозможное (поскольку LinkedEnumMap нет) — это... ошибка. - person Tester; 21.07.2017
comment
Вы не пропустите ни одного выступления. Вы можете хранить отсортированный список перечислений, но в то же время выполнять сопоставление с EnumMap. Доступ к EnumMap очень эффективен. - person xenteros; 21.07.2017
comment
Цель LinkedHashMap состоит в том, что он может поддерживать порядок ключей либо в порядке вставки, либо в порядке доступа. Он также может функционировать как кэш LRU. EnumMap всегда поддерживает свои ключи в их естественном порядке, поэтому я думаю, что EnumMap редко, если вообще когда-либо, будет возможной заменой LinkedHashMap. - person Evan Darke; 21.07.2017
comment
@EvanDarke он не заменит, но его можно использовать в сочетании со списком для ускорения процесса - в данном случае - подсчета элементов. - person xenteros; 21.07.2017
comment
Тот факт, что EnumMaps существуют, не означает, что их нужно использовать постоянно. Когда у вас есть два связанных объекта, вы должны убедиться, что они обновляются, например, вместе. Это добавляет сложности. - person GhostCat; 21.07.2017
comment
@GhostCat Я согласен. - person xenteros; 21.07.2017