Java 记录值得拥有为其量身打造的映射器

发布日期:2026-05-24 10:02:45   浏览量 :2
发布日期:2026-05-24 10:02:45  
2

2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家 

自 Java 16 起,Java 记录(Records)已处于稳定状态,随着 Java 21 成为长期支持(LTS)基线,它们正无处不在地出现——数据传输对象(DTOs)、值对象、领域模型。它们天生不可变、简洁且语义清晰。

但这里存在一个无人提及的缺口:Java 生态系统中的每个对象映射器都是在记录(Records)出现之前构建的。它们是围绕 JavaBean 设计的——即具有 getter、setter 和无参构造函数的可变对象。而记录不具备这些特性。那么会发生什么?这些库作为事后补救措施,勉强添加了部分记录支持,因此破绽百出。

我构建了 Immuto 来填补这一缺口。

retrofitting(后期适配)记录支持的问题

记录的身份由其规范构造函数定义:

public record PersonDTO(Long id, String fullName, String email) {}

该构造函数是创建 PersonDTO唯一方式。没有 setter。除非你自己编写,否则没有构建器。组件访问器是只读的。

现有的映射器并非为此设计。为了与记录配合使用,它们要么:

  • 生成不存在的 setter 调用(并在运行时失败)
  • 要求你编写一个可变构建器作为变通方案
  • 回退到对私有字段的反射——完全绕过规范构造函数

这些都是运行时故障。在运行代码之前,你无法得知存在问题。

Immuto 的不同之处

Immuto 是一个注解处理器——它在执行 mvn compile 期间运行,工作方式与 Lombok 和基于注解处理工具(APT)的方法相同。它生成普通的 .java 源文件,直接调用你记录的规范构造函数。无反射。无 setter。无运行时意外。

@RecordMapper
public interface PersonMapper {

    @Mapping(target = "fullName",
             expression = "java(source.firstName() + \" \" + source.lastName())")
    PersonDTO toDto(PersonEntity source);

    @InheritInverseConfiguration(name = "toDto")
    PersonEntity toEntity(PersonDTO source);
}

在执行 mvn compile 后,Immuto 将 PersonMapperImpl.java 写入 target/generated-sources 目录。它看起来完全像你手动编写的代码:

@Generated

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
支持 反馈 订阅 数据
回到顶部