(SonarQube)LinkedHashMap 和 S1640(告诉您使用 EnumMap)

问题描述 投票:0回答:3

我可能会错过一些东西,但是声明一个 LinkedHashmap:

private final LinkedHashMap<anEnum, anInteger> linkedHashMap;

及之后:

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

结果:

“具有枚举值键的映射应替换为 EnumMap” (鱿鱼:1640)

由于不存在“LinkedEnumMap”,因此应忽略此声明。

java enums sonarqube sonarlint
3个回答
5
投票

事情是:使用 EnumMap 是很好的做法,因此 SonarQube 告诉你这样做。

但是您明确选择使用 LinkedHashMap - 它可以跟踪插入顺序。

因此该消息可以解释为:

  • 当您只关心映射枚举时,请使用 EnumMap
  • 当您需要映射枚举并关心插入顺序时,您必须使用普通的 LinkedHashMap

换句话说:请记住,这些工具只是工具。他们提供信息来帮助您做出明智的决定。当您确定当前的实现很好时 - 那么不要更改您的代码,只是因为某些工具提出了这样的“建议”。


0
投票

与枚举类型键一起使用的专用 Map 实现。所有的 枚举映射中的键必须来自单个枚举类型,即 创建地图时显式或隐式指定。枚举 映射在内部表示为数组。这个表示是 极其紧凑且高效。

--文档

基本上这不是一个错误,这是一个很好的推荐。每个

Enum
都有其来自声明顺序的顺序。您可以在
values()
返回的数组中看到它。

EnumMap
保持该顺序并将值实际存储在数组中。

另一方面,您可以决定哪个集合更适合您的目的。我相信将

EnumMap
List
组合起来可能会让您感兴趣,但请记住,声纳只是一个提示。您可以重新配置您的声纳并告诉它不要指示这种情况。


0
投票
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.