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