2

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

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

4

2 回答 2

3

这完全取决于你想要做什么。

我更喜欢让二传手制作副本。调用方法可以重用对象,因此也可以修改设置的对象(如果没有复制)。您将不得不决定是否希望这种情况发生。

对于吸气剂,您必须决定是否希望对返回对象的更改直接影响“原始”。

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

于 2014-06-04T09:27:48.113 回答
0

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

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

于 2014-06-05T07:25:23.770 回答