Java Record 在以下场景非常适用:
1. 数据传输对象(DTO)
```java
// API 响应数据
record ApiResponse<T>(int code, String message, T data) {}
// 数据库查询结果
record UserInfo(String username, String email, LocalDate joinDate) {}
```
2. 值对象(Value Objects)
```java
// 坐标点
record Point(int x, int y) {}
// 货币金额
record Money(BigDecimal amount, Currency currency) {}
// 颜色 RGBA
record Color(int red, int green, int blue, int alpha) {}
```
3. 方法返回多个值
```java
record Pair<F, S>(F first, S second) {}
public Pair<String, Integer> findMaxAndIndex(String[] array) {
// 返回最大值和它的索引
return new Pair<>(maxValue, index);
}
```
4. 不可变的配置/参数对象
```java
record DatabaseConfig(
String url,
String username,
String password,
int poolSize
) {}
record ServiceConfig(
int timeout,
int retries,
String endpoint
) {}
```
5. 事件/消息对象
```java
record OrderEvent(
String orderId,
EventType type,
LocalDateTime timestamp,
Map<String, Object> payload
) {}
record Notification(
String recipient,
String title,
String body,
NotificationType type
) {}
```
6. 中间计算结果
```java
record AnalysisResult(
double average,
double median,
double standardDeviation
) {}
record ValidationResult(
boolean isValid,
List<String> errors
) {}
```
7. 复合键
```java
// 用于 Map 的复合键
record UserKey(String userId, UserType type) {}
Map<UserKey, UserSession> sessions = new HashMap<>();
```
8. 测试数据
```java
record TestUser(
String username,
String password,
UserRole role
) {}
// 创建测试数据
TestUser admin = new TestUser("admin", "123", UserRole.ADMIN);
```
✅ Record 的最佳使用场景:
· 数据载体:主要是存储数据的类
· 不可变性:天然不可变,线程安全
· 值语义:基于内容比较(equals/hashCode)
· 简单结构:不需要复杂逻辑的类
· 模式匹配:与 instanceof 和 switch 模式匹配配合好
⚠️ 不适合使用 Record 的场景:
· 需要可变状态:Record 所有字段都是 final
· 需要继承:Record 是 final 类
· 需要自定义字段存储逻辑:字段都是直接存储
· 需要封装复杂行为:Record 主要用于数据存储
· 需要非规范构造函数:只能有一个规范构造函数
示例:完整使用场景
```java
// 定义 Record
record OrderItem(String productId, int quantity, BigDecimal price) {}
record Order(
String orderId,
Customer customer,
List<OrderItem> items,
OrderStatus status,
LocalDateTime createdAt
) {
// 可以添加紧凑构造函数进行验证
public Order {
Objects.requireNonNull(orderId);
Objects.requireNonNull(customer);
items = List.copyOf(items); // 防御性复制
}
// 可以添加业务方法
public BigDecimal totalAmount() {
return items.stream()
.map(item -> item.price().multiply(BigDecimal.valueOf(item.quantity())))
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
}
// 使用模式匹配
if (order instanceof Order(String id, Customer cust, var items, var status, var time)) {
// 可以直接使用解构的变量
}
```
Record 让简单的数据载体类的代码量减少约 70%,同时提供了更好的语义和安全性。