【问题标题】:PMD reference to a mutable object of an interface对接口的可变对象的 PMD 引用
【发布时间】:2019-02-14 15:32:43
【问题描述】:

类似于this question。我有一个接口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.

我怎样才能完成我想要的(带有 to/from 日期验证的接口)而不必在所有实现者中实现 setDate 方法(我认为这会破坏目的)?

【问题讨论】:

    标签: java pmd


    【解决方案1】:

    问题是 java.util.Date 是可变的,你在你的 getter 中返回它。所以有人可以这样做:

    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. 在您使用这些 a 类之一的任何地方禁止显示警告。
    3. 不要使用 Lombok 并在 setter 和 getter 中复制日期,而不仅仅是存储/返回对日期的引用。
    4. 使用 java.time.ZonedDateTime(或 LocalDateTime)代替 Date。 ZonedDateTime 是不可变的,不应导致此警告。

    我建议第四个选项。不仅因为它消除了 PMD 警告,还因为 Java 8 中的新时间 API 比 java.util.Date 更好、更容易使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多