lombok 自动使用
我喜欢布兰登(Brandon )在博客文章中比较Project Lombok , AutoValue和Immutables的建议 ,而这篇文章试图做到这一点。 我已经简要概述了Project Lombok , AutoValue和Immutables ,但是这篇文章有所不同,因为它突出了它们之间的异同。
Lombok, AutoValue和Immutables有很多相同之处,我尝试用以下单个描述性句子总结这些相似之处:Lombok,AutoValue和Immutables使用注释处理为值对象类所使用的常见操作生成样板代码。 本文的其余部分将更详细地探讨这些相似之处,并对比这三种方法。
代码生成
Lombok,AutoValue和Immutables均旨在从简洁的代码表示形式生成详细的样板代码,这些代码表示形式专注于高级业务逻辑,而将实现的低级细节留给代码生成。 常见的对象方法,例如toString() , equals(Object)和hashCode()很重要,但需要正确编写。 容易犯这些错误,即使最初正确地编写了这些错误(包括通过IDE生成),但在对类产生影响的其他更改时也可以忽略它们。
价值对象
Lombok , AutoValue和Immutables均支持生成“ 值对象” 。 尽管AutoValue严格执行值对象的生成,但如果指定了@Modifiable ,则Immutables允许生成的对象是可修改的,并且Lombok在其生成的类中使用@Set和@Data等批注支持多级修改。
超越价值对象
AutoValue专注于值对象的生成,并基于模板类中的抽象方法,支持字段,构造函数/生成器,具体访问器方法的生成以及常见方法equals(Object)
, hashCode()
和toString()
的实现。
Immutables提供的功能类似于AutoValue提供的功能,并添加了使用@ Value.Modifiable生成可修改类的功能 。 不可变对象还提供其他功能 ,包括:
Lombok提供了类似于具有@Value批注的AutoValue的值类生成功能,并提供了使用@Data批注生成可修改类的功能。 Lombok还提供其他功能 ,包括:
基于注释处理
Lombok , AutoValue和Immutables都通过注释处理从更简洁的模板代码生成了更多冗长的样板代码。 每个都包含一个在其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
通过注释处理生成不可变对象
Lombok通过与AutoValue和Immutables不同的注释处理来实现生成。 Lombok生成具有与“模板”源代码相同的类名的已编译.class
文件,并将生成的方法添加到此已编译版本中。 开发人员仅在查看.java
文件时会看到简洁的模板代码,而在查看.class
文件时会看到源代码中不存在的方法的编译后的.class
文件。 Lombok生成的不是另一个源文件,而是原始源的增强编译版本。 有一个delombok选项可以与Lombok一起使用,以查看增强的.class
文件背后生成的源代码是什么样子,但该项目的真正目的是从简洁的模板源直接转换为增强的编译类,而无需使用或使用中间增强功能。源文件。 delombok
选项可用于查看生成的源的外观,或者更重要的是,可以在将其与工具混淆以使源(简洁的模板.java
文件)和生成的类(生成的类)不一致的情况下使用.class
同名的.class
文件)。
Lombok通过注释处理生成
Lombok的注释处理方法不像AutoValue和Immutables所采用的方法那样传统,并且包括Lombok的创建者在内的一些人将这种方法称为“ hack” 。 Neildo的帖子Lombok – Trick Explained中很好地解释了Lombok的“技巧”或“ hack”,并引用了内容丰富的OpenJDK编译概述 。
围绕Lombok的方法引起争议的主要原因密切相关,并且是它使用了非标准的API,因此,很难与IDE和执行自己的编译的其他工具(例如javadoc )很好地集成。 由于AutoValue和Immutables自然会使用新的类名生成源代码,因此任何传统工具和IDE都可以将生成的源代码与模板源代码一起使用,而不会出现任何重大问题。
异同摘要
特性 | Lombok计划 | 自动值 | 不可变的 | 注释 |
---|---|---|---|---|
涵盖版本 | 1.16.8 ( 2016年 ) | 1.2 ( 2016 ) | 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。
- 这三个工具箱都支持某种程度的自定义,并且希望自定义所生成代码的开发人员可能希望选择允许他们以所需方式自定义所生成代码的工具箱。
- JDK 1.6支持AutoValue和Lombok,但Immutables需要JDK 1.7。
结论
Lombok,AutoValue和Immutables有很多共同点,并且全部三个都可以用来从简单的模板文件生成值类。 但是,它们各自提供不同的优势和功能,这可能会导致它们中的任何一个相对于其他开发者更具吸引力,这取决于开发者的个人情况。
翻译自: https://www.javacodegeeks.com/2016/06/lombok-autovalue-immutables.html
lombok 自动使用