Findbugs在我的代码上报告了很多EI_EXPOSE_REP和EI_EXPOSE_REP2错误,每次我写这样的getter和setter:
public Date getDate() {
return date;
}
public void setDate(final Date date) {
this.date = date;
}
我理解报告的含义,我不应该将我的objet的内部引用暴露给外界,以便它们不会被恶意/错误的代码修改。修复将是:
public Date getDate() {
return date == null ? null : date.clone();
}
public void setDate(Date date) {
this.date = date == null ? null : date.clone();
}
我的问题不在这里。我很惊讶这份报告关注的是ALWAYS Date。为什么不是所有其他可变对象?我认为这份报告也适用于所有可变对象,不是吗?
我应该将这种“良好做法”扩展到我处理可变对象的所有访问者吗?
给我你的建议,谢谢
答案 0 :(得分:3)
我当然希望这份报告与所有可变对象相关,但我怀疑FindBugs知道某些常见的违规者。
我通常小心通过吸气剂暴露内部状态,例如
public ArrayList<Trade> getTrades() {
return trades;
}
装置
因此有两种方法。
类似的参数与setter和构造函数参数有关。
请注意,您可以发现自己在暴露时复制大量物品以保护自己,并可能进行大量额外工作。这是一种明智的使用技术,值得了解客户对象是谁,以及是否可以控制和/或信任它们。
答案 1 :(得分:1)
Date对象有setMonth和其他setter来操作值,因为大多数其他mutable没有setter来改变它的值(例如Integer没有任何setter)。
Case 1 :
Date date = obj.getDate();
date.setHours(10);
Case 2 :
Integer i = obj.getI();
i = 10;
Finbug仅将案例1视为安全威胁。