Java Record 类的 10 个实用技巧
James Park | 2026-09-11T20:01:00 | Java
Java Record 不只是简化 POJO 那么简单。分享 10 个在实际项目中很有用但很多人不知道的 Record 用法。
Java Record 从 14 预览到 16 正式发布,现在已经很成熟了。但很多人只把它当成 Lombok @Data 的替代品,其实它能做的远不止这些。 ## 1. 紧凑构造器做参数校验 ```java public record Money(BigDecimal amount, String currency) { public Money { // 紧凑构造器,不需要写参数 if (amount.compareTo(BigDecimal.ZERO) cache = new HashMap(); cache.put(new CacheKey("u1", "profile"), profileData); ``` ## 5. 替代 Tuple Java 没有原生 Tuple,以前要自己写 Pair 类。Record 可以快速定义: ```java record Pair(A first, B second) {} record Triple(A first, B second, C third) {} ``` ## 6. 局部 Record 方法内部可以定义 Record,非常适合中间数据结构: ```java public List processOrders(List orders) { record OrderSummary(String id, BigDecimal total) {} return orders.stream() .map(o -> new OrderSummary(o.getId(), o.calculateTotal())) .filter(s -> s.total().compareTo(new BigDecimal("100")) > 0) .map(OrderSummary::id) .toList(); } ``` ## 7. 配合 Jackson 序列化 Record 天然支持 Jackson 序列化/反序列化,不需要额外注解: ```java public record ApiResponse(int code, String message, T data) {} // Jackson 自动识别 Record 的组件作为 JSON 字段 ``` ## 8. 作为 DTO Record 的不可变性非常适合做 DTO(数据传输对象): ```java public record CreateUserRequest( @NotBlank String username, @Email String email, @Size(min = 8) String password ) {} ``` Bean Validation 注解也能正常工作。 ## 9. 嵌套 Record ```java public record Address(String city, String street, String zipCode) {} public record Company(String name, Address address) {} var company = new Company("iDev", new Address("Shenzhen", "Tech Road 1", "518000")); ``` ## 10. 配合 Pattern Matching (Java 21+) ```java static String describe(Shape shape) { return switch (shape) { case Circle(var r) when r > 10 -> "Large circle with radius " + r; case Circle(var r) -> "Small circle with radius " + r; case Rectangle(var w, var h) -> "Rectangle " + w + "x" + h; }; } ``` Record + sealed interface + pattern matching 是现代 Java 最优雅的组合之一。 ## 什么时候不用 Record - 需要可变状态(Record 的字段是 final 的) - 需要继承(Record 隐式 extends java.lang.Record,不能继承其他类) - 需要 JPA Entity(JPA 要求无参构造器和 setter,Record 不适合)