有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Sonar错误使此成员“受保护”

在下面的类中,我声明myMap

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

我需要访问其他类中的地图

public class Test {
    FieldMap.Map;
}

一切正常,但声纳在一等舱发出警告:

Make this member "protected".

在线

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

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


共 (3) 个答案

  1. # 1 楼答案

    如果需要在其他类中访问映射,则应保护它不受修改:

    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)的更多信息

  2. # 2 楼答案

    Sonar lint问题,因为您正在向客户端代码公开对可变对象的引用。在这里,您将公开一个映射,尽管它是最终的。最终对象允许客户端修改对象的内容

    切勿将此类字段初始化为客户端提供的对象引用或从访问者返回对象引用

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

    Reference link

    Reference link2

  3. # 3 楼答案

    Sonar建议您的“成员”,即:

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

    不应该公开

    为什么

    将其保留为public将使其从任何其他包中可用——因此您将向所有人公开该成员。下面的代码正在直接访问member

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

    在大多数情况下members应该是private并由getterssetters访问,这可能会阻止返回相同的引用-因此您可以在get引用或set引用之前实现一些逻辑

    如果需要使用static,请使用staticgetter和setter