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


这更像是问题的后续行动 1 & 2

正如以下代码中的问题所述

public Date getSomeDate() {
   return someDate;
}

会给你findbug错误 问题

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

public Date getSomeDate() {
  return new Date(someDate.getTime());
} 

这是一个很好的方法还是有其他方法可以做到这一点?

在Java中是否有可以解决此问题的任何不可变日期库?


10105
2017-10-28 17:10


起源

你的意思是不变的吗?无论如何,陈述的方法是完美的。 - Prince John Wesley
@PrinceJohnWesley:谢谢,是的。我已经更新了Q.你的意思是说它可以在所有的getter和setter中使用Date构造函数吗? - ManuPK
只要您不公开对外部库的调用。你不需要深度克隆(构造函数),因为你知道你在做什么。否则总是给出差异参考,如果它是可变的。试试joda time api - Prince John Wesley


答案:


JodaTime 有不可变的日期。

当然,可以使用 Date 吸气器中的构造函数,为什么不呢?

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


6
2017-10-28 17:28





关注人......

除了适应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());
  }
}

7
2017-11-05 09:19





根据您的使用情况,您可以返回 someDate.getTime() 没有包装它 Date


0
2017-10-28 17:56





等一下......复制内的对象 getSomeDate 和 setSomeDate 方法我们没有消除安全风险,因为更改的对象通过 setSomeDate 和副本保留更改的值。有必要删除 setSomeDate 为了解决这种安全问题,或者根本不用担心它。


0
2017-08-01 12:30



通过返回对象的副本,我们避免共享内部表示 - 它将有助于避免调用代码(即使它将此属性接收到局部变量)操纵它,bean属性将被更改。说明显而易见的是,无法删除setsomeDate,因为这是基本的bean行为。 - emeralddove