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

时间:2017-09-26 08:15:28

标签: java sonarqube protected

在下面的课程中,我宣布了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;
}

一切都运转良好,但声纳在第一堂课上发出警告:

  

将此成员“保护”。

就行了

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

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

3 个答案:

答案 0 :(得分:2)

声纳正在向您建议您的&#34;会员&#34;这是:

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,请设置static getter和setter。

答案 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 :(得分:0)

Sonar lint问题,因为您将可变对象的引用暴露给客户端代码。虽然它是最终的最终对象允许客户端修改对象的内容,但是您正在公开Map。

永远不要将此类字段初始化为客户端提供的对象引用,也不要从访问者返回对象引用。

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

Reference link

Reference link2