声纳错误 - 加入此成员 "protected"

Sonar Error - Make this member "protected"

在下面 class 我声明了 myMap

public class AllMap {
    public static final Map<String, String> myMap= new HashMap<>();
    static {
        Map.put("yy", "AA");
        Map.put("xx", "BB");
    }
}

我需要访问其他 class 中的地图。

public class Test {
    FieldMap.Map;
}

一切正常,但声纳在 1 日发出警告 class:

Make this member "protected".

在线

public static final Map<String, String> myMap = new HashMap<>();

我应该忽略这个警告还是应该将其更改为受保护?

Sonar 给你的建议是你的 "member" 即:

public final Map<String, String> myMap = new HashMap<>();

应该是public。

为什么?

将此保留为 public 可以从任何其他包 获得它 - 因此您将成员公开给所有人。下面的代码直接访问 member

AllMap allMap = new AllMap();
allMap.myMap.put("X", "Y");

在大多数情况下 members 应该是 private 并由 getterssetters 访问,这可以防止返回相同的引用 - 所以你可以实现一些逻辑在 get 参考或 set 之前。

如果需要将其设为 static,请设为 static getter 和 setter。

Sonar lint 问题,因为您正在向客户端公开对可变对象的引用 code.Here 您正在公开 Map 虽然它是最终对象,但最终对象允许客户端修改对象的内容。

切勿将此类字段初始化为客户端提供的对象引用或return来自访问器的对象引用。

private static final SomeType [] THE_THINGS = { ... };
public static final List<SomeType> SOMETHINGS =
  Collections.unmodifiableList(Arrays.asList(THE_THINGS));

Reference link

Reference link2

如果您需要访问其他 类 中的地图,那么您应该保护它不被修改:

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class AllMap {
    public static final Map<String, String> myMap;
    static {
        final Map<String, String> tmpMap = new HashMap<>();
        tmpMap.put("yy", "AA");
        tmpMap.put("xx", "BB");
        myMap = Collections.unmodifiableMap(tmpMap);
    }
}

您仍然可以使用它并且 SonarQube 不会将此标记为错误(因为地图是只读的)。

详细了解 Collections#unmodifiableMap(Map)