在下面的课程中,我宣布了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<>();
我应该忽略此警告还是应该将其更改为受保护?
答案 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
并由getters
和setters
访问,这可能会阻止返回相同的引用 - 因此您可以先实现某些逻辑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不会将其标记为错误(因为地图是只读的)。
答案 2 :(得分:0)
Sonar lint问题,因为您将可变对象的引用暴露给客户端代码。虽然它是最终的最终对象允许客户端修改对象的内容,但是您正在公开Map。
永远不要将此类字段初始化为客户端提供的对象引用,也不要从访问者返回对象引用。
private static final SomeType [] THE_THINGS = { ... };
public static final List<SomeType> SOMETHINGS =
Collections.unmodifiableList(Arrays.asList(THE_THINGS));