gpt4 book ai didi

java - PMD 对接口(interface)的可变对象的引用

转载 作者:行者123 更新时间:2023-12-01 19:42:44 24 4
gpt4 key购买 nike

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

我怎样才能完成我想要的(具有截止日期/截止日期验证的接口(interface)),而不必在所有实现者中实现 setDate 方法(我认为这会达不到目的)?

最佳答案

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

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

关于java - PMD 对接口(interface)的可变对象的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54693931/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com