代码之家  ›  专栏  ›  技术社区  ›  user1682076

声纳错误-使此成员“受保护”

  •  4
  • user1682076  · 技术社区  · 7 年前

    在下面的课堂上,我宣布我的地图

    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;
    }
    

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

    在线上

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

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

    3 回复  |  直到 7 年前
        1
  •  5
  •   agabrys    7 年前

    如果需要在其他类中访问地图,则应保护其免受修改:

    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
  •   DevDio    7 年前

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

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

    应该 公开。

    为什么?

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

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

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

    如果你需要的话 static 制作 静止的 接球手和接球手。

        3
  •  1
  •   gati sahu    7 年前

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

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

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

    Reference link

    Reference link2