记录(Java 16+)是简洁的、不可变的数据载体,能自动生成样板代码,而密封类(Java 17+)限制哪些类可以扩展/实现某个类型。两者都是现代特性,使 Java 更富表现力,并支持更好的建模。
记录 — 不可变数据,零样板代码
java
{}
(, );
p.x();
p.equals( (, ));
p;
p.hashCode();
记录自动从其组件生成 constructor、accessors、equals()、hashCode() 和 toString()。字段是 final(不可变的)— 记录设计用于透明的、不可变的数据载体(DTO、值对象、坐标等)。
public record Range(int min, int max) {
public Range { // compact constructor — validate
if (min > max) throw new IllegalArgumentException("min > max");
}
public int size() { return max - min; } // can add methods
}
// restrict WHO can extend/implement — only the named classes
public sealed interface Shape permits Circle, Square, Triangle {}
public final class Circle implements Shape { double radius; }
public final class Square implements Shape { double side; }
public final class Triangle implements Shape { double base, height; }
// no other class can implement Shape
sealed 类型显式列出其允许的子类型 — 你控制实现的完整集合,编译器会强制执行。这对应了一个闭合层次结构(固定的、已知的变体集合)。
// the compiler KNOWS all the cases → exhaustive switch (no default needed)
double area = switch (shape) {
case Circle c -> Math.PI * c.radius() * c.radius();
case Square s -> s.side() * s.side();
case Triangle t -> 0.5 * t.base() * t.height();
// no default needed — sealed guarantees these are ALL the cases
};
由于密封类型的子类型是已知且有限的,编译器可以验证 switch 是否穷尽所有情况 — 捕获遗漏的分支。结合记录和模式匹配,这为 Java 带来了代数数据类型风格的建模能力。
记录和密封类是重要的现代 Java 特性,改进了表现力和安全性。记录消除了繁琐的、容易出错的数据类样板代码(并保证了正确一致的 equals/hashCode — 解决了这一常见陷阱),同时强制不可变性 — 使 DTO、值对象和数据建模变得清晰得多。密封类支持闭合的、受控的类型层次结构,编译器能够理解它,结合记录和模式匹配 switch,允许以穷尽、类型安全的方式处理一组固定的变体(代数数据类型)。
综合起来,它们使 Java 更简洁、默认不可变,并能够进行更安全的领域建模 — 这是旧版 Java 需要更多代码才能实现的。
了解它们体现了对当代 Java 的掌握,使你能够设计更清晰、更稳健的代码,而这在早期的 Java 版本中需要更多的工作量。