声纳抱怨静态分配

时间:2019-08-07 20:21:44

标签: java sonarqube

我将这个赋值分配给一个静态变量,该变量从文件中读取数据:

public static final Map<String, Integer> MY_DATA_RESOURCE;
static {
    MY_DATA_RESOURCE = parseAndTransformFile();
  }

我希望所有类都可以公开访问此变量,并且希望通过此方法调用对其进行初始化。这样做会引发Sonar投诉“尽管可变字段不应为“公共静态”。

我有一个parseAndTransform方法,我不想多次直接调用并每次都触发一次读取,而且我还想避免添加一个getter方法,该方法基本上是在数据访问中增加了第三层。

我在这里还有其他选择吗?

2 个答案:

答案 0 :(得分:1)

无论您的字段被声明为final,地图本身都不是不变的,并且您仍然可以向其中put()填充一些项目(除非您正在使用某些Collections.unmodifiableMap()-但无论如何您都不会这么做)不能通过界面知道这一点),这就是Sonar抱怨的原因

尝试将Map包装在某些不可变的类实现中,并将字段的类型更改为此类。这具有额外的优点,即如果将来您决定需要添加一些有关文件的其他元数据(例如创建时间),而不是在Map结构中进行雕刻,则可以轻松地将字段添加到自己的映射器类

答案 1 :(得分:1)

您可以使用番石榴的immutable maps

public static final ImmutableMap<String, Integer> MY_DATA_RESOURCE = 
    ImmutableMap.copyOf(yourMethodCall());

您还可以使用静态方法,而不是字段:

private static final Map<String, Integer> MY_DATA_RESOURCE;

static {
  MY_DATA_RESOURCE = parseAndTransformFile();
}

public static Map<String, Integer> myDataResource() {
  return Collections.unmodifiableMap(MY_DATA_RESOURCE);
}

使用这种方法,您最终还可以决定懒惰地解析和转换文件(当有人询问文件的内容时),而不是static {}块中。