我将这个赋值分配给一个静态变量,该变量从文件中读取数据:
public static final Map<String, Integer> MY_DATA_RESOURCE;
static {
MY_DATA_RESOURCE = parseAndTransformFile();
}
我希望所有类都可以公开访问此变量,并且希望通过此方法调用对其进行初始化。这样做会引发Sonar投诉“尽管可变字段不应为“公共静态”。
我有一个parseAndTransform方法,我不想多次直接调用并每次都触发一次读取,而且我还想避免添加一个getter方法,该方法基本上是在数据访问中增加了第三层。
我在这里还有其他选择吗?
答案 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 {}
块中。