猿问

声纳抱怨静态分配

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


public static final Map<String, Integer> MY_DATA_RESOURCE;

static {

    MY_DATA_RESOURCE = parseAndTransformFile();

  }

我希望所有类都可以公开访问这个变量,并且我想用这个方法调用来初始化它。这样做会触发声纳投诉“可变字段不应该是”公共静态“。


我有一个 parseAndTransform 方法,我不想多次直接调用它并每次都触发读取,我也想避免添加 getter 方法,这基本上是为数据访问添加第三层。


我还有其他选择吗?


慕的地10843
浏览 91回答 2
2回答

梦里花落0921

但是,您的字段被声明为final,地图本身不是不可变的,您仍然可以put()向它添加一些项目(除非您正在使用一些项目Collections.unmodifiableMap()-但无论如何您都不知道界面),这就是 Sonar 抱怨的原因尝试将 包装Map在一些不可变的类实现中,并将字段的类型更改为此类。这有这个额外的好处,如果将来你决定需要添加一些关于文件的额外元数据(比如创建时间)而不是在结构中雕刻,你可以轻松地向你自己的映射器类添加一个Map字段

森栏

您可以使用番石榴的不可变地图: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 {}。
随时随地看视频慕课网APP

相关分类

Java
我要回答