FindBugs EI_EXPOSE_REP错误只涉及日期吗?

时间:2012-11-20 12:23:21

标签: java getter-setter findbugs accessor

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。为什么不是所有其他可变对象?我认为这份报告也适用于所有可变对象,不是吗?

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

给我你的建议,谢谢

2 个答案:

答案 0 :(得分:3)

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

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

public ArrayList<Trade> getTrades() {
   return trades;
}

装置

  1. 客户可能会接触到您的交易清单中的更改
  2. 客户可能会更改您真诚传递的列表
  3. 因此有两种方法。

    1. 传递该对象的不可变变体(即无法更改的对象)。在上面的场景中,您将获取该列表的只读副本并将其传递出去(您可能会认为您可以只使用一个简单的读写副本并传递它,因为它不会影响原始对象,但这是违反直觉的)
    2. 不要传递对象(交易列表),而是让拥有对象对您执行该集合的操作。这可能是OO的本质 - 告诉对象为你做事而不是向他们询问信息并自己做
    3. 类似的参数与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视为安全威胁。