我喜欢布兰登(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生成可修改类的功能 。 不可变对象还提供其他功能 ,包括:

  • 单例实例
  • 预先计算的哈希码
  • 实例实习
  • 可自定义的equals(Object),hashCode()和toString()实现,包括从中排除字段
  • 基本和高级序列化

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。
  • 这三个工具箱都支持某种程度的自定义,并且希望自定义生成的代码的开发人员可能希望选择允许他们以所需方式自定义生成的代码的工具箱。
    • Lombok提供了一种配置系统 ,该系统允许将生成的代码的多个方面调整为所需的约定。
  • JDK 1.6支持AutoValue和Lombok,但Immutables需要JDK 1.7。

结论

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

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

Lombok,自动值和不可变项相关推荐

  1. lombok 自动使用_Lombok,自动值和不可变项

    lombok 自动使用 我喜欢布兰登(Brandon )在博客文章中比较Project Lombok , AutoValue和Immutables的建议 ,而这篇文章试图做到这一点. 我已经简要概述了 ...

  2. 使用Lombok自动实例化Logger以及错误解决方案

    之前我们经常使用的日志对象实例化是这样的 public class AaaController{private Logger logger = Logger.getLogger(AaaControll ...

  3. 如何给Lombok Builder提供默认值

    来源:生活点亮技术 1.概览 在这个教程中,我们将研究如何基于Lombok在实现 Builder模式时为属性提供默认值. 请务必阅读这篇Lombok简介 . 2.Maven依赖 在本教程中,我们将使用 ...

  4. import lombok 报错_lombok

    Lombok简介 Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法.官方地址:https:/ ...

  5. Lombok 介绍和使用详情

    介绍 在项目中使用Lombok可以减少很多重复代码的书写.比如说getter/setter/toString等方法的编写. IDEA中的安装 打开IDEA的Setting –> 选择Plugin ...

  6. 超级全面的 Lombok 注解介绍,学一波!

    作者:riemann blog.csdn.net/riemann_/article/details/105374987 一.@Getter and @Setter 使用@Getter和/或@Sette ...

  7. lombok 的使用

    Lombok使用 介绍 在项目中使用Lombok可以减少很多重复代码的书写.比如说getter/setter/toString等方法的编写. IDEA中的安装 打开IDEA的Setting –> ...

  8. 20190905 Lombok常用注解

    Lombok常用注解 val 用于声明类型,将从初始化表达式推断出类型,仅适用于局部变量和foreach循环,而不适用于字段.声明的局部变量为final变量. Java自带类型推断随着JDK版本提升越 ...

  9. Lombok链式调用,子类对象set父类属性,返回父类对象

    前言 lombok相信大家都用过,没用过肯定也不会点进来,一直用着都很舒服.今但是天在码代码时,碰到了一个问题,卡了半天.问题是这样的:Lombok链式调用父类中的set属性时,返回的居然是一个父类对 ...

最新文章

  1. 想知道什么是“成员变量”吗?
  2. PPT 下载 | 神策数据孙文亮:客户全生命周期管理从方法到实践全解析
  3. python中的孤儿进程
  4. Unix——fprintf与stderr、stdout的使用
  5. 凉山州计算机等级考试时间,2020年四川凉山中考考试时间及科目安排(已公布)...
  6. [转载] Python3入门精通基础教程(合集)
  7. vue的一些坑(第二天)
  8. 服务器下 读取springboot application配置文件_一文读懂 Spring Boot 配置文件 application.properties !...
  9. 2022 百度之星程序设计大赛复赛 D.子序列2(动态dp/线段树维护矩阵)
  10. 计算机软件资格好考吗,计算机软件资格辅导哪个好
  11. winpe加载raid_WinPE添加RAID驱动的步骤
  12. python读取地震信号【sgy,segy】
  13. httpd安装、配置、编译三种访问模式控制https证书的安装访问实例及排错
  14. php账单明细功能怎么实现,PHP实现微信优势对账单处理
  15. 有个懂你的人,是温暖
  16. 如何用SCRM销售管理系统管理销售和做销售管理
  17. TensorFlow练手项目二:基于循环神经网络(RNN)的古诗生成器
  18. InstallShield 2010集成 net Framework 4的安装包制作
  19. 聊聊jvm的内存结构, 以及各种结构的作用
  20. 万字长文 | 2023届校招算法岗知识总结

热门文章

  1. require.ensure与require AMD的区别
  2. 简单介绍Java中Comparable和Comparator
  3. Servlet使用适配器模式进行增删改查案例(IDeptService.java)
  4. 快速排序+时间测试(yyds)
  5. git 拉取gitlab代码
  6. kafka控制器,复制与存储小结
  7. java泛型程序设计——约束与局限性
  8. 设置 JDK环境变量(Windows)
  9. vaadin_Vaadin提示:延迟加载和商品标识
  10. spring 配置只读事务_只读副本和Spring Data第1部分:配置数据库