gpt4 book ai didi

java - FindBugs EI_EXPOSE_REP 错误是否只涉及日期?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:22:14 40 4
gpt4 key购买 nike

Findbugs 报告我的代码中有很多 EI_EXPOSE_REP 和 EI_EXPOSE_REP2 错误,每次我这样编写 getter 和 setter 时:

  public Date getDate() {
return date;
}
public void setDate(final Date date) {
this.date = date;
}

我理解报告的意思,我不应该将我的对象的内部引用暴露给外界,这样它们就不会被恶意/错误代码修改。解决办法是:

  public Date getDate() {
return date == null ? null : date.clone();
}
public void setDate(Date date) {
this.date = date == null ? null : date.clone();
}

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

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

给个建议,谢谢

最佳答案

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

我通常很小心地通过 setter/getter 暴露内部状态,例如

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

表示

  1. 客户可能会接触到您交易 list 的变化
  2. 客户可能会更改您善意传递的列表

因此有两种方法。

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

类似的参数与 setter 和构造函数参数有关。

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

关于java - FindBugs EI_EXPOSE_REP 错误是否只涉及日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13473155/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com