将参数类型更改为不可变的,例如 LocalDate (Java 8)。
好处:之后没有人可以修改这个(不可变的)日期。
错误说明
查看 Spotbugs 的文档 > 错误描述 for EI_EXPOSE_REP2: EI2: May expose internal representation by incorporating reference to mutable object:
此代码将对外部可变对象的引用存储到对象的内部表示中。如果实例由不受信任的代码访问,并且对可变对象的未经检查的更改会危及安全性或其他重要属性,则您将需要做一些不同的事情。在许多情况下,存储对象的副本是更好的方法。
注意:您也可以在FindBugs' bug descriptions 中查找此类描述。
修复:使用不可变的日期对象,例如 LocalDate
要解决不可变参数(如调用 new foo.pkg.Key(Client, Product, Date, String))的 FindBugs 问题,请将构造函数更改为接受 不可变 日期对象,如:
- Joda Time 的
DateTime:
所有主要的日期时间类都是不可变的(如字符串),创建后无法更改。
- 自 Java 8
LocalDate 或 Java 8 的其他不可变项日期和时间 API (JSR 310)。请参阅 Ben Evans 和 Richard Warburton (2014) 的文章中的新 Time API 概念:Java SE 8 Date and Time:
不可变值类。 Java 中现有格式化程序的严重弱点之一是它们不是线程安全的。这给开发人员增加了以线程安全的方式使用它们的负担,并在他们的日期处理代码的日常开发中考虑并发问题。新 API 通过确保其所有核心类都是不可变的并表示明确定义的值来避免这个问题。
var today = LocalDate.now();
var key = new Key(client, product, today, "immutable date - can't change")`
// no modification possible:
today.setYear(1988); // no such modifier exists
此外,您的实体类中的构造函数和字段需要设计为不可变,例如:
package foo.pkg;
public class Key {
private LocalDate expiryDate; // now immutable (before: Date)
// remaining fields omitted
public Key(Client client, Product product, LocalDate expiryDate, String s) {
this.expiryDate = expiryDate;
// remaining initialization omitted
}
}
查看相关问题