Lombok,自动值和不可变项

我喜欢布兰登(Brandon )在博客文章中比较Project LombokAutoValueImmutables建议 ,而这篇文章试图做到这一点。 我已经简要概述了Project LombokAutoValueImmutables ,但是这篇文章有所不同,因为它突出了它们之间的异同。

Lombok, AutoValue和Immutables有很多共同点,我尝试在这单个描述性句子中总结这些相似之处:Lombok,AutoValue和Immutables使用注释处理为值对象类使用的常见操作生成样板代码。 本文的其余部分将更详细地探讨这些相似之处,并对比三种方法。

代码生成

Lombok,AutoValue和Immutables都旨在从简洁的代码表示形式生成详细的样板代码,这些代码表示形式专注于高级业务逻辑,而将实现的低级细节留给代码生成。 常见的对象方法(例如toString()equals(Object)hashCode())很重要,但需要正确编写。 容易犯这些错误,即使最初正确地编写了这些错误(包括通过IDE生成),但在对类产生影响的其他更改时也可以忽略它们。

价值对象

LombokAutoValueImmutables均支持生成“ 值对象” 。 尽管AutoValue严格执行值对象的生成,但如果指定了@Modifiable ,则Immutables允许生成的对象可修改,并且Lombok在其生成的类中使用@Set@Data等批注支持多级修改。

超越价值对象

AutoValue专注于值对象的生成,并基于模板类中的抽象方法,支持字段,构造函数/生成器,具体访问器方法以及常见方法equals(Object)hashCode()toString()的实现的生成。

Immutables提供的功能类似于AutoValue提供的功能,并添加了使用@ Value.Modifiable生成可修改类的功能 。 不可变对象还提供其他功能 ,包括:

Lombok通过@Value注释提供类似于AutoValue的值类生成功能,并提供通过@Data注释生成可修改类的功能。 Lombok还提供其他功能 ,包括:

基于注释处理

LombokAutoValueImmutables都通过注释处理从更简洁的模板代码中生成了更详细的样板代码。 每个都包括在其JAR文件的META-INF/services区域javax.annotation.processing.Processor定义的javax.annotation.processing.Processor ,作为javac编译器一部分的标准注释处理器发现过程一部分

并非所有注释处理都相同

尽管Lombok,AutoValue和Immutables都通过javac进行注释处理 ,但是Lombok如何使用注释处理的细节与AutoValue和Immutables的处理方法不同。 AutoValue和Immutables在更常规的意义上使用注释处理,并从源生成源。 由AutoValue和Immutables生成的类源代码的名称与模板类不同,实际上是扩展了模板类。 AutoValue和Immutables都读取模板类,并在Java源代码中生成一个具有自己名称的全新类,该类具有所有生成的方法和字段。 这避免了与模板类的任何名称冲突,并且使模板类源代码和生成的类源代码在同一IDE项目中的混合相当容易,因为它们实际上是不同的类。

通过注释处理生成AutoValue

20160622-autoValueJavacAnnotationsProcessing.copy

通过注释处理生成不可变对象

20160622-immutablesJavacAnnotations处理

Lombok通过与AutoValue和Immutables不同的批注处理来实现生成。 Lombok生成具有与“模板”源代码相同的类名的已编译.class文件,并将生成的方法添加到此已编译版本中。 开发人员仅在查看.java文件时会看到简洁的模板代码,而在查看.class文件时会看到源代码中不存在的方法的编译后的.class文件。 Lombok生成的不是另一个源文件,而是原始源的增强编译版本。 有一个delombok选项可以与Lombok一起使用,以查看增强的.class文件背后生成的源代码是什么样子,但是该项目的真正目的是将其从简洁的模板源直接转换为增强的编译类,而无需使用或使用中间增强功能。源文件。 delombok选项可用于查看生成的源的外观,或者,更重要的是,可以在将其与工具混淆以使源(简洁的.java文件)和生成的类(生成的类)不一致的情况下使用.class同一名称的.class文件)。

Lombok通过注释处理生成

20160622-lombokJavacAnnotations处理

Lombok的注释处理方法不像AutoValue和Immutables所采用的方法那么传统,包括Lombok的创建者在内一些人将这种方法称为“ hack”Neildo在发布的Lombok – Trick Explained项目中很好地解释了Lombok的“技巧”或“ hack”,并引用了内容丰富的OpenJDK编译概述

围绕Lombok的方法引起争议的主要原因是密切相关的,并且它使用的是非标准API,因此很难与IDE和执行自己的编译的其他工具(例如javadoc )很好地集成。 因为AutoValue和Immutables自然会使用新的类名生成源代码,所以任何传统工具和IDE都可以将生成的源代码与模板源代码一起使用,而不会出现任何重大问题。

异同摘要

特性 Lombok计划 自动值 不可变的 注释
涵盖版本 1.16.82016年 1.22016 2.2.8 (2016年) 此帖子使用的版本
起源年份 2009年 2014年 2014年
执照 麻省理工 阿帕奇2 阿帕奇2 全部开源
最低Java 1.6 1.6 1.7 支持的最旧的Java版本
依存关系 ASM用于Eclipse集成 ASM (可选) 运行时依赖项Guava 编译时依赖(包含)的库
javax.annotation.processing.Processor lombok.launch.AnnotationProcessorHider $ AnnotationProcessor com.google.auto.value.processor.AutoAnnotationProcessor
com.google.auto.value.processor.AutoValueBuilderProcessor
com.google.auto.value.processor.AutoValueProcessor
org.immutables.processor.ProxyProcessor 标准注释处理器规范位置
生成的源与模板源的关系 增强的生成类替换模板源 生成的源扩展了模板源 Lombok仅显示带有“ delombok”选项的生成源
访问生成的源 指定delombok选项 默认 默认 查看/控制生成的源代码
生成方法 equals(Object)hashCode()toString()构造 /生成访问器设置器 equals(Object),hashCode(),toString(),构造/生成器,访问器 equals(Object)hashCode()toString()构造 /生成 ,访问器, 设置器
不变程度 允许使用字段级@Set进行完全可变,但在需要不可变性时提供@Value 加强严格的不变性 偏重于不变性 ”,但提供了类级别的@ Value.Modifiable AutoValue的意见最多,Lombok的意见最少
奖励功能 资源清理
不可变可变
偷偷地抛出检查异常 对象同步锁 记录注释 更多 …
忠实于价值客体的概念
记录的最佳做法
样式定制
序列化 (包括JSON
预先计算的哈希码 更多…

选择时的注意事项

Lombok,AutoValue和Immutables是类似的工具包,它们提供类似的好处,并且这三种方法中的任何一种都可以被广泛的应用程序成功使用。 但是,在选择使用哪个工具箱时,可以考虑它们之间的差异。

  • Lombok生成的类和模板具有相同的包和类名,而AutoValue和Immutables生成的类扩展了模板类并具有自己的类名(但具有相同的包)。
    • 希望编译的.class文件具有与模板类完全相同的包和名称的开发人员将首选Lombok。
  • AutoValue是这三个工具包中最自以为是的,而Lombok则是最不自以为是的。
    • 希望严格执行“值对象”特征的开发人员可能更喜欢AutoValue。
  • AutoValue和Immutables使用标准注释处理,而Lombok使用非标准注释处理方法。
    • 希望避免非标准依赖关系的开发人员将倾向于使用AutoValue或Immutables。
  • 这三个工具箱都支持某种程度的自定义,并且希望自定义生成的代码的开发人员可能希望选择允许他们以所需方式自定义生成的代码的工具箱。
    • Lombok提供了一种配置系统 ,该系统允许将生成的代码的多个方面调整为所需的约定。
  • JDK 1.6支持AutoValue和Lombok,但Immutables需要JDK 1.7。

结论

Lombok,AutoValue和Immutables有很多共同点,并且全部三个都可以用于从简单的模板文件生成值类。 但是,它们各自提供不同的优点和功能,这可能会导致它们中的任何一个相对于其他开发者都具有不同的吸引力,具体取决于开发者的个人情况。

翻译自: https://www.javacodegeeks.com/2016/06/lombok-autovalue-immutables.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值