Проблемы Findbugs с изменчивостью объекта Date в Java - PullRequest
11 голосов
/ 28 октября 2011

Это больше продолжение вопросов 1 & 2 .

Как сказано в вопросах ниже код

public Date getSomeDate() {
   return someDate;
}

выдаст ошибку findbug issue .

Предлагаемое решение состояло в том, чтобы дублировать объект Date как в методах получения, так и в методах установки, подобных

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

Это хороший подход или есть альтернативные пути к этому?

Существует ли какая-либо библиотека неизменяемых дат в java, способная решить эту проблему?

Ответы [ 4 ]

7 голосов
/ 05 ноября 2013

Внимание, люди ...

Помимо адаптации и геттера, и сеттера, вам нужно позаботиться о нулевых значениях:

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());
  }
}
6 голосов
/ 28 октября 2011

JodaTime имеет неизменные даты.

Конечно, можно использовать конструктор Date в геттере, почему бы и не быть?То, что FindBugs считает изменяемое состояние потенциальной ошибкой, вовсе не означает, что о ней стоит заботиться - это зависит от того, как используется класс.Неизменность устраняет один тип ошибок, о которых вам может быть или не нужно беспокоиться.

0 голосов
/ 01 августа 2012

Подождите минуту ... копируя объект в методах getSomeDate и setSomeDate, мы не исключаем угрозы безопасности, поскольку измененный объект возвращается через setSomeDate и копии сохраняют измененные значения. Было бы необходимо удалить setSomeDate, чтобы решить эту проблему безопасности, или вообще не беспокоиться об этом.

0 голосов
/ 28 октября 2011

В зависимости от вашего варианта использования вы можете вернуть someDate.getTime(), не заключая его в Date.

...