Findbugs与Java中日期对象的可变性有关

Findbugs与Java中日期对象的可变性有关,java,coding-style,findbugs,Java,Coding Style,Findbugs,这更多的是对问题的跟进& 如问题中所述,请输入以下代码 public Date getSomeDate() { return someDate; } 将为您提供findbug错误 建议的解决方案是在getter和setter中复制Date对象,如 public Date getSomeDate() { return new Date(someDate.getTime()); } 这是一个好方法还是有其他方法 java中是否有可以克服此问题的不可变日期库?具有不可变日期 当然,在g

这更多的是对问题的跟进&

如问题中所述,请输入以下代码

public Date getSomeDate() {
   return someDate;
}
将为您提供findbug错误

建议的解决方案是在getter和setter中复制Date对象,如

public Date getSomeDate() {
  return new Date(someDate.getTime());
} 
这是一个好方法还是有其他方法

java中是否有可以克服此问题的不可变日期库?

具有不可变日期

当然,在getter中使用
Date
构造函数是可以的,为什么不呢


也就是说,仅仅因为FindBugs将可变状态标记为一个潜在错误,并不意味着它本质上值得关注——这取决于类的使用方式。不变性消除了一种类型的bug,您可能需要也可能不需要太在意这种bug。

根据您的用例,您可以返回
someDate.getTime()
,而无需将其包装在
日期中

等等。。。通过在
getSomeDate
setSomeDate
方法中复制对象,我们并没有消除安全风险,因为更改的对象通过
setSomeDate
返回并保留更改的值。为了解决此类安全问题,有必要删除
setSomeDate
,或者根本不用担心它。

各位注意

除了调整getter和setter之外,还需要注意空值:

public Date getSomeDate() {
  if (this.someDate == null) {
    return null;
  }
  return new Date(this.someDate.getTime());
}

public void setSomeDate(final Date someDate) {
  if (someDate == null) {
    this.someDate = null;
  } else{
  this.someDate = new Date(someDate.getTime());
  }
}

你是说一成不变,对吗?无论如何,这种方法是完美的。@PrinceJohnWesley:谢谢,是的。我已经更新了Qs。您的意思是说在所有getter和setter中使用日期构造函数是可以的,只要您不将调用公开给外部库。你不需要深度克隆它,因为你知道自己在做什么。否则,如果差异是可变的,请始终提供差异引用。尝试joda time Api通过返回对象的副本,我们可以避免共享内部表示—这将有助于避免调用代码(即使它将此属性接收到局部变量)对此进行操作的情况,bean属性将被更改。显而易见,setsomeDate不能被删除,因为这是bean的基本行为。你能举个例子说明它消除了哪种错误吗?@TomDane。。。在这种情况下,某些东西会改变你的状态。这不是唯一的
Date
,它与任何允许你改变内部状态的东西一样。我希望不是。我希望您知道,
someDate
不是null,将null传递给setter将被视为一个错误。防御性复制甚至给我们免费的空检查。