为了账号安全,请及时绑定邮箱和手机立即绑定

声纳抱怨静态分配

声纳抱怨静态分配

慕的地10843 2023-05-24 16:07:33
我将此分配给一个静态变量,该变量从文件中读取数据:public static final Map<String, Integer> MY_DATA_RESOURCE;static {    MY_DATA_RESOURCE = parseAndTransformFile();  }我希望所有类都可以公开访问这个变量,并且我想用这个方法调用来初始化它。这样做会触发声纳投诉“可变字段不应该是”公共静态“。我有一个 parseAndTransform 方法,我不想多次直接调用它并每次都触发读取,我也想避免添加 getter 方法,这基本上是为数据访问添加第三层。我还有其他选择吗?
查看完整描述

2 回答

?
梦里花落0921

TA贡献1772条经验 获得超5个赞

但是,您的字段被声明为final,地图本身不是不可变的,您仍然可以put()向它添加一些项目(除非您正在使用一些项目Collections.unmodifiableMap()-但无论如何您都不知道界面),这就是 Sonar 抱怨的原因

尝试将 包装Map在一些不可变的类实现中,并将字段的类型更改为此类。这有这个额外的好处,如果将来你决定需要添加一些关于文件的额外元数据(比如创建时间)而不是在结构中雕刻,你可以轻松地向你自己的映射器类添加一个Map字段


查看完整回答
反对 回复 2023-05-24
?
森栏

TA贡献1810条经验 获得超5个赞

您可以使用番石榴的不可变地图:

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 {}。


查看完整回答
反对 回复 2023-05-24
  • 2 回答
  • 0 关注
  • 90 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信