声纳错误 - 加入此成员 "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
并由 getters
和 setters
访问,这可以防止返回相同的引用 - 所以你可以实现一些逻辑在 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));
如果您需要访问其他 类 中的地图,那么您应该保护它不被修改:
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 不会将此标记为错误(因为地图是只读的)。
在下面 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
并由 getters
和 setters
访问,这可以防止返回相同的引用 - 所以你可以实现一些逻辑在 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));
如果您需要访问其他 类 中的地图,那么您应该保护它不被修改:
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 不会将此标记为错误(因为地图是只读的)。