声纳抱怨静态分配
Sonar complaining about static assignment
我将这个赋值给了一个从文件中读取数据的静态变量:
public static final Map<String, Integer> MY_DATA_RESOURCE;
static {
MY_DATA_RESOURCE = parseAndTransformFile();
}
我希望此变量 public 可供所有 类 访问,并且我想使用此方法调用对其进行初始化。不过,这样做会触发声纳投诉 "Mutable fields should not be "public 静态”。
我有一个 parseAndTransform 方法,我不想多次直接调用它并每次都触发读取,我也想避免添加 getter 方法,这基本上是在数据访问中添加第三层.
这里还有其他选择吗?
但是您的字段被声明为 final
,地图本身并不是不可变的,您仍然可以 put()
它的一些项目(除非您正在使用一些 Collections.unmodifiableMap()
- 但无论如何你通过界面不知道这一点),这就是 Sonar 抱怨的原因
尝试将 Map
包装在一些不可变的 class 实现中,并将字段类型更改为此 class。这具有额外的优势,如果将来您决定需要添加一些关于文件的额外元数据(如创建时间)而不是在 Map
结构中雕刻,您可以轻松地向您的字段添加一个字段自己的映射器 class
你可以使用 Guava 的 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 {}
块中。
我将这个赋值给了一个从文件中读取数据的静态变量:
public static final Map<String, Integer> MY_DATA_RESOURCE;
static {
MY_DATA_RESOURCE = parseAndTransformFile();
}
我希望此变量 public 可供所有 类 访问,并且我想使用此方法调用对其进行初始化。不过,这样做会触发声纳投诉 "Mutable fields should not be "public 静态”。
我有一个 parseAndTransform 方法,我不想多次直接调用它并每次都触发读取,我也想避免添加 getter 方法,这基本上是在数据访问中添加第三层.
这里还有其他选择吗?
但是您的字段被声明为 final
,地图本身并不是不可变的,您仍然可以 put()
它的一些项目(除非您正在使用一些 Collections.unmodifiableMap()
- 但无论如何你通过界面不知道这一点),这就是 Sonar 抱怨的原因
尝试将 Map
包装在一些不可变的 class 实现中,并将字段类型更改为此 class。这具有额外的优势,如果将来您决定需要添加一些关于文件的额外元数据(如创建时间)而不是在 Map
结构中雕刻,您可以轻松地向您的字段添加一个字段自己的映射器 class
你可以使用 Guava 的 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 {}
块中。