PMD ссылка на изменяемый объект интерфейса - PullRequest
0 голосов
/ 14 февраля 2019

Похоже на этот вопрос .У меня есть интерфейс DateRangeModel:

Я использую это для автоматической проверки дат в реализаторах:

public interface DateRangeModel {

    @ApiModelProperty(value = "From date. Must be less than to date.")
    @Column()
    Date getFromDate();

    void setFromDate(Date date);

    @ApiModelProperty(value = "To date. Must be greater than to date.")
    @Column()
    Date getToDate();

    void setToDate(Date date);


    /**
     * Checks that if both dates are populated, a valid date range is used.
     *
     * @return true if the date is a valid range.
     */
    @AssertTrue(message = "To date must be greater than or equal to from date.")
    @JsonIgnore
    default boolean areDatesValid() {

        if (getToDate() != null && getFromDate() != null) {
            return !getFromDate().after(getToDate());
        }
        return true;
    }
}

Я реализую это так:

@EqualsAndHashCode
@Data
@Builder
public class BirthdayParty implements DateRangeModel {

    Date fromDate;
    Date toDate;
    String name;

}

Что компилируетсяи, кажется, работает, но я получаю эту ошибку при запуске PMD:

Returning a reference to a mutable object value stored in one of the object's fields exposes the internal representation of the object.

Как я могу либо выполнить то, что я хочу (интерфейс с проверкой даты до / от), без необходимости реализовывать методы setDate во всехреализаторы (которые, я думаю, победили бы цель)?

1 Ответ

0 голосов
/ 15 февраля 2019

Проблема в том, что java.util.Date является изменяемым, и вы возвращаете его в свои методы получения.Чтобы кто-то мог сделать это:

BirthdayParty party = ...;
Date fromDate = party.getFromDate();
...
Date someDate = fromDate;
...
// you might not be aware that this also changes the fromDate in party
someDate.setTime(12345678);

Вы можете сделать четыре вещи:

  1. Отключить правило PMD.
  2. Подавлять предупреждение везде, где вы его используете.из них классы.
  3. Не используйте Lombok и копируйте даты в ваших методах установки и получения вместо того, чтобы просто сохранять / возвращать ссылку на дату.
  4. Использовать java.time.ZonedDateTime (или LocalDateTime) вместо даты.ZonedDateTime является неизменным и не должен приводить к этому предупреждению.

Я предлагаю четвертый вариант.Не только потому, что он избавляется от предупреждения PMD, но и потому, что новый API времени в Java 8 намного лучше и проще в использовании, чем java.util.Date.

...