我有一堆使用 Lombok 的“数据”类,我想将它们全部迁移到使用 Java 14 中提供的新记录功能。使用新的 Java 14 记录功能,是否可以为同一个记录创建多个构造函数?如果没有,还有其他选择吗?
Ale*_*rov 17
在 Java 14 中,记录不能有多个构造函数(参考:Java 14 - JEP 359:记录(预览版))。
从 Java 15 和 16+ 开始,记录可能有多个构造函数。(请参阅Java 15 - JEP 384:记录(第二预览版)和Java 16 - JEP 395:记录(最终版))。
但是,每个构造函数必须委托给记录的规范构造函数,该构造函数可以显式定义或自动生成。
一个例子:
public record Person(
String firstName,
String lastName
) {
// Compact canonical constructor:
public Person {
// Validations only; fields are assigned automatically.
Objects.requireNonNull(firstName);
Objects.requireNonNull(lastName);
// An explicit fields assignment, like
// this.firstName = firstName;
// would be a syntax error in compact-form canonical constructor
}
public Person(String lastName) {
// Additional constructors MUST delegate to the canonical constructor,
// either directly:
this("John", lastName);
}
public Person() {
// ... or indirectly:
this("Doe");
}
}
Run Code Online (Sandbox Code Playgroud)
另一个例子:
public record Person(
String firstName,
String lastName
) {
// Canonical constructor isn't defined in code,
// so it is generated implicitly by the compiler.
public Person(String lastName) {
// Additional constructors still MUST delegate to the canonical constructor!
// This works:
this("John", lastName);
// (Re-)Assigning fields here directly would be a compiler error:
// this.lastName = lastName; // ERROR: Variable 'lastName' might already have been assigned to
}
public Person() {
// Delegates to Person(String), which in turn delegates to the canonical constructor:
this("Doe");
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8515 次 |
| 最近记录: |