Findbugs涉及Java中Date对象的可变性问题



这是对问题1 & &;2 .

如问题所述,以下代码

public Date getSomeDate() {
   return someDate;
}

将给出findbug错误问题。

建议的解决方案是在getter和setter中复制Date对象,如
public Date getSomeDate() {
  return new Date(someDate.getTime());
} 

这是一个好方法还是有其他替代方法?

在java中有任何可用的不可变日期库可以克服这个问题吗?

大家注意了…

除了调整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());
  }
}

JodaTime具有不可变的日期。

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

也就是说,仅仅因为FindBugs把可变状态作为一个潜在的错误,并不意味着它本质上值得关心;它取决于如何使用类。不变性消除了一种类型的bug,您可能需要也可能不需要太在意。

根据您的使用情况,您可以返回someDate.getTime()而不将其包装在Date中。

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

最新更新