Spotbugs + Java:可以通过将外部可变对象存储到 QuestionPojo.map 中来公开内部表示
Spotbugs + Java: may expose internal representation by storing an externally mutable object into QuestionPojo.map
关于 Spotbug 发现的小问题,我很难解决。
在这个超级简单的 POJO 上:
import java.util.Map;
public class QuestionPojo {
private final Map<String, String> map;
public QuestionPojo(Map<String, String> map) {
this.map = map;
}
public Map<String, String> getMap() {
return map;
}
@Override
public String toString() {
return "QuestionPojo{" +
"map=" + map +
'}';
}
}
我在 map
和 may expose internal representation by storing an externally mutable object into QuestionPojo.map
上得到标记
一次 this.map = map;
另一个在 getter return map
.
我尝试调用可能的 clone()
方法,但它似乎在 Map 中不受支持。
请问我该如何解决这个问题?
谢谢
may expose internal representation by storing an externally mutable object into QuestionPojo.map
这告诉你的是这个 class 实例的内部状态可以在 class.
之外改变
例如:
Map<String, String> map = new HashMap<>();
map.put("hello", "world");
QuestionPojo qp = new QuestionPojo(map);
// Both of these lines change the map stored inside qp.
map.clear();
qp.getMap().put("silly", "silly");
至于这种外部状态变化是否重要取决于你的语义class - 一般来说这是不可取的,但是,因为它很难推断其行为,因为可以从远处更改地图(即任何引用 QuestionPojo 或地图的地方)。
解决方案是防御性复制:在构造函数中复制地图:
public QuestionPojo(Map<String, String> map) {
this.map = new HashMap<>(map);
}
和return地图副本在getter:
public Map<String, String> getMap() {
return new HashMap<>(map);
}
这意味着 class 之外的任何人都无法访问存储在 class 中的地图。
关于 Spotbug 发现的小问题,我很难解决。
在这个超级简单的 POJO 上:
import java.util.Map;
public class QuestionPojo {
private final Map<String, String> map;
public QuestionPojo(Map<String, String> map) {
this.map = map;
}
public Map<String, String> getMap() {
return map;
}
@Override
public String toString() {
return "QuestionPojo{" +
"map=" + map +
'}';
}
}
我在 map
和 may expose internal representation by storing an externally mutable object into QuestionPojo.map
一次 this.map = map;
另一个在 getter return map
.
我尝试调用可能的 clone()
方法,但它似乎在 Map 中不受支持。
请问我该如何解决这个问题?
谢谢
may expose internal representation by storing an externally mutable object into QuestionPojo.map
这告诉你的是这个 class 实例的内部状态可以在 class.
之外改变例如:
Map<String, String> map = new HashMap<>();
map.put("hello", "world");
QuestionPojo qp = new QuestionPojo(map);
// Both of these lines change the map stored inside qp.
map.clear();
qp.getMap().put("silly", "silly");
至于这种外部状态变化是否重要取决于你的语义class - 一般来说这是不可取的,但是,因为它很难推断其行为,因为可以从远处更改地图(即任何引用 QuestionPojo 或地图的地方)。
解决方案是防御性复制:在构造函数中复制地图:
public QuestionPojo(Map<String, String> map) {
this.map = new HashMap<>(map);
}
和return地图副本在getter:
public Map<String, String> getMap() {
return new HashMap<>(map);
}
这意味着 class 之外的任何人都无法访问存储在 class 中的地图。