java record 什么场景下用

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%,同时提供了更好的语义和安全性。