FindBugs EI_EXPOSE_REP错误只涉及日期吗?

mou*_*dug 6 java findbugs accessor getter-setter

Findbugs在我的代码上报告了很多EI_EXPOSE_REP和EI_EXPOSE_REP2错误,每次我写这样的getter和setter:

  public Date getDate() {
    return date;
  }
  public void setDate(final Date date) {
    this.date = date;
  }
Run Code Online (Sandbox Code Playgroud)

我理解报告的含义,我不应该将我的objet的内部引用暴露给外部世界,以便它们不会被恶意/错误的代码修改.修复将是:

  public Date getDate() {
    return date == null ? null : date.clone();
  }
  public void setDate(Date date) {
    this.date = date == null ? null : date.clone();
  }
Run Code Online (Sandbox Code Playgroud)

我的问题不在这里.我很惊讶这份报告关注的是ALWAYS Date.为什么不是所有其他可变对象?我认为这份报告也适用于所有可变对象,不是吗?

我是否应该将这种"良好做法"扩展到我处理可变对象的所有访问者?

给我你的建议,谢谢

Bri*_*new 3

我当然希望这份报告与所有可变对象相关,但我怀疑 FindBugs 知道某些常见的违规者。

我通常会小心地通过吸气剂暴露内部状态,例如

public ArrayList<Trade> getTrades() {
   return trades;
}
Run Code Online (Sandbox Code Playgroud)

方法

  1. 客户可能会受到您交易清单变化的影响
  2. 客户可能会更改您善意分发的清单

因此有两种方法。

  1. 传递该对象的不可变变体(即无法更改的对象)。在上面的场景中,您将获取该列表的只读副本并将其传递出去(您可能会认为您可以只获取一个简单的读写副本并传递它,因为它不会影响原始对象,但这是违反直觉的)
  2. 不要传递对象(交易列表),而是让拥有对象为您对该集合执行操作。这也许就是面向对象告诉对象为您做事而不是向它们询问信息并自己做事的本质。

类似的参数涉及 setter 和构造函数参数。

请注意,您可能会发现自己在暴露后复制了很多对象以保护自己,并且可能会做很多额外的工作。这是一种需要谨慎使用的技术,值得了解您的客户对象是谁,以及您是否可以控制和/或信任他们。