EI_EXPOSE_REP2 setter方法

时间:2014-06-04 09:01:43

标签: java findbugs effective-java

Findbugs抱怨日期对象并建议创建防御性副本。 我在构造函数和getter方法中使用了副本,但是在setter方法中创建防御性副本真的很有必要吗?这是一个例子:

    public Info(Date created) {
        this.creationDate = new Date(created.getTime());
    }

    public Date getCreated() {
        return new Date(creationDate.getTime());
    }

    public void setCreated(Date created) {
        this.creationDate = created;
    }

有没有办法获取原始对象并进行更改?

2 个答案:

答案 0 :(得分:3)

这一切都取决于你想要做什么。

我更喜欢让制定者制作副本。调用方法可以重用该对象,从而也修改设置对象(如果没有复制)。你必须决定是否要发生这种情况。

对于getter,你必须决定是否要对返回的对象进行更改直接影响'original'。

通常,制作副本会减慢速度并使用更多内存,而如果无意中修改了对象,则不进行复制会导致错误。

答案 1 :(得分:0)

如果您的类是公共API,则setter需要防御性副本,因为攻击者可能会恶意修改传递给 后传递给它的日期,在无意中更改类的内部状态方式。它可以绕过setter中的检查,因为它们仅在调用方法时才起作用,而不是在调用方法之后。

攻击者不需要“获取”原始Date对象:他可以简单地保存传递的引用并在调用setter后修改它。