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

我在 mapmay 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 中的地图。