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;
}
有没有办法获取原始对象并进行更改?
答案 0 :(得分:3)
这一切都取决于你想要做什么。
我更喜欢让制定者制作副本。调用方法可以重用该对象,从而也修改设置对象(如果没有复制)。你必须决定是否要发生这种情况。
对于getter,你必须决定是否要对返回的对象进行更改直接影响'original'。
通常,制作副本会减慢速度并使用更多内存,而如果无意中修改了对象,则不进行复制会导致错误。
答案 1 :(得分:0)
如果您的类是公共API,则setter需要防御性副本,因为攻击者可能会恶意修改传递给
攻击者不需要“获取”原始Date对象:他可以简单地保存传递的引用并在调用setter后修改它。