在 Java 21 里,记录类(Record)和 Sealed 接口已成为常用的语言特性。本文将深入探讨它们的核心概念、优势,并给出实际编码示例,帮助开发者在项目中更高效地使用这两种特性。
-
记录类(Record)概述
记录类是一种轻量级的数据类,专门用于携带不可变的数据。其语法简洁且自动生成了构造器、equals、hashCode、toString 等方法。相较于传统 POJO,记录类可以显著减少样板代码,并且更易于维护。 -
Sealed 接口与类
Sealed 接口/类允许开发者在类层次结构中显式声明哪些类或接口可以继承或实现它们。通过这种方式,程序员可以在编译时就控制继承关系,提高代码的可预测性和安全性。 -
记录类与 Sealed 接口的结合
在许多场景下,将记录类声明为 Sealed 接口或类可以获得最佳组合效果。例如,定义一个不可变的统一事件类型体系,所有事件类型都需要继承自同一 Sealed 记录类。
// 定义 Sealed 记录类 Event
public sealed record Event(String type, long timestamp) permits UserLoginEvent, UserLogoutEvent {}
// 具体事件实现
public final record UserLoginEvent(String type, long timestamp, String username) extends Event(type, timestamp) {}
public final record UserLogoutEvent(String type, long timestamp, String username) extends Event(type, timestamp) {}
- 性能与安全性评估
- 不可变性:记录类默认字段为 final,避免了多线程环境下的数据竞争。
- 编译时安全:Sealed 接口在编译时检查继承关系,防止后期误加不受控制的子类。
- 可读性:组合使用可以让代码结构一目了然,减少维护成本。
- 实战案例:日志框架
在一个分布式系统中,需要统一处理不同来源的日志事件。利用记录类和 Sealed 接口,我们可以设计一个可扩展且安全的事件处理器。
public sealed interface LogEvent permits InfoEvent, WarnEvent, ErrorEvent {}
public record InfoEvent(String message, long timestamp) implements LogEvent {}
public record WarnEvent(String message, long timestamp, String warningCode) implements LogEvent {}
public record ErrorEvent(String message, long timestamp, Throwable cause) implements LogEvent {}
// 处理器
public class LogProcessor {
public void process(LogEvent event) {
switch (event) {
case InfoEvent info -> handleInfo(info);
case WarnEvent warn -> handleWarn(warn);
case ErrorEvent err -> handleError(err);
default -> throw new IllegalStateException("Unexpected event: " + event);
}
}
private void handleInfo(InfoEvent e) { /*...*/ }
private void handleWarn(WarnEvent e) { /*...*/ }
private void handleError(ErrorEvent e) { /*...*/ }
}
- 小结
- 记录类让不可变数据结构的编写更简洁。
- Sealed 接口/类提供编译时的继承安全。
- 两者组合使用可打造既安全又易维护的代码结构,尤其适用于事件驱动、日志系统、DTO 等领域。
建议在新项目中优先考虑使用记录类与 Sealed 接口,以提升代码质量与团队协作效率。

发表回复