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

  • 单例实例
  • 预先计算的哈希码
  • 实例实习
  • 可自定义的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

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.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353628.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux对于zombie的处理

(Linux基础)[僵尸进程处理] 今天在服务器上推送项目的时候,突然发现很卡。就用top查看了一下,果然此事不简单啊。 top - 10:39:16 up 20 days, 23:11, 2 users, load average: 1.13, 1.09, 1.03 Tasks: 204 total, 2 running, 196 sleeping, 1 sto…

POJ - 1847 Tram(dijkstra)

题意:有向图有N个点,当电车进入交叉口(某点)时,它只能在开关指向的方向离开。 如果驾驶员想要采取其他方式,他/她必须手动更换开关。当驾驶员从路口A驶向路口B时,他/她尝试选择将他/她不得不手动…

用interrupt()中断Java线程

Javathread 最近在学习Java线程相关的东西,和大家分享一下,有错误之处欢迎大家指正. 假如我们有一个任务如下,交给一个Java线程来执行,如何才能保证调用interrupt()来中断它呢? Java代码 class ATask imple…

activemq和jms_保证主题,JMS规范和ActiveMQ的消息传递

activemq和jms最近,一位客户要求我仔细研究ActiveMQ的“持久”消息的实现,它如何应用于主题以及在存在非持久订户的故障转移方案中会发生什么。 我已经了解到,JMS语义规定,即使面对消息代理提供程序故障,也只能保证主题…

JAVA分代收集机制详解

Java堆中是JVM管理的最大一块内存空间。主要存放对象实例。在JAVA中堆被分为两块区域:新生代(young)、老年代(old)。堆大小新生代老年代;(新生代占堆空间的1/3、老年代占堆空间2/3)新…

FizzBu​​zz Kata与Java流

在柔道练习仅几周之后,我的儿子感到无聊。 他抱怨说自己没有学任何东西,因为他一遍又一遍地做着同样的事情。 混淆学习和做新事物的不仅仅是幼儿。 例如,有多少软件开发人员通过执行kata或参加dojos来进行刻意练习的麻烦? 重复您…

高可用架构

转载于:https://www.cnblogs.com/138026310/p/9088341.html

vc6.0快捷键

2010-09-14 17:46 F1 显示帮助,如果光标停在代码的某个字符上,显示MSDN中相应的帮助内容(需要安装MSDN才能使用) F2 书签功能: CtrlF2 --在某行设置一个书签(再按一次是取消) F2 --跳到下一个书签位置 ShiftF2 --跳到上一个书签位置 CtrlShiftF2 --删除…

ES6 各浏览器支持情况

http://kangax.github.io/compat-table/es6/转载于:https://www.cnblogs.com/likwin/p/9091008.html

MFC删除类的小窍门

VC 并没有提供删除一个类的简洁方法,我们需要手工删除,但过程并不复杂。例如,我们有一个 CMyButton 的类,对应的文件为 MyButton.h 和 MyButton.cpp ,我们先到工程目录中删除这两个文件,此时该类信息自动从…

ios plist 国际化_Java与iOS对话:Java对象与Apple plist序列化

ios plist 国际化我很高兴地宣布我的第一个开源项目java-plist-serializer可以帮助您将Java(尤其是基于Spring的应用程序)与iOS应用程序集成在一起。 背景 我正在将Java webapp作为后端并且客户端是iOS设备的项目。 最近,我收到了创建Web服务…

vtk环境搭建(windowsXP/win7,vtk6.0.0+cmake2.8+vs2010)

1. 安装vs2010(默认方式) 2. 安装cmake2.8(默认方式) 3. 新建文件夹作为vtk文件根目录(例如"E:\vtk6.0"),解压vtk-6.0.0.zip到根目录,将VTK6.0.0改名为vtk;解…

P1993 小K的农场 (差分约束)

题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b至少多种植了c个单位…

将Quartz与Spring集成

在Java应用程序中调度作业时,Quartz是第一个考虑的工具。 Quartz是由最流行的RDBMS支持的作业调度程序。 这真的很方便,并且很容易与spring集成。 为了创建石英模式,您必须下载石英发行版并解压缩位于crystal-2.2.3 / docs / dbTables /中的…

linux下md5sum的使用

在linux或Unix上,md5sum是用来计算和校验文件报文摘要的工具程序。一般来说,安装了Linux后,就会有md5sum这个工具,直接在命令行终端直接运行。1、使用md5sum来产生指纹(报文摘要)命令如下:md5su…

深入理解Python中的元类(metaclass)

注:本文原稿来自stackoverflow,原文链接,目前已收获5k高赞。 一、类也是对象 在理解元类之前,你需要先掌握Python中的类。Python中类的概念借鉴于Smalltalk,这显得有些奇特。在大多数编程语言中,类就是一组…

6个步骤卸载wine

今天在ubuntu下装了个wine,感觉界面很难看,跟ubuntu风格不协调。所以我把它卸载了。 根据网上找的资料,我是按如下步骤卸载: 1.终端运行sudo apt-get remove wine,运行发现系统还有wine的图标残留,于是 2…

OpenStack基础知识-virtualenv工具详解

1、virtualenv介绍 virtualenv通过创建一个单独的虚拟化python运行环境,将我们所需的依赖安装进去,不同项目之间相互不干扰,从而解决不同的项目之间依赖不同,造成的冲突问题 2、安装virtualenv 通过pip命令,安装virtua…

java中的五种排序方法_用Java排序的五种有用方法

java中的五种排序方法Java排序快速概述: 正常的列表: private static List VEGETABLES Arrays.asList("apple", "cocumbers", "blackberry");Collections.sort(VEGETABLES);output: apple, blackberry, cocumbers反向排…

压缩vmware中的ubuntu系统(虚拟机瘦身大法)

压缩vmware中的ubuntu系统&#xff08;虚拟机瘦身大法&#xff09; 前提:你的虚拟机大小 < 你放置虚拟机的磁盘的剩余空间 1.在Termial(终端)里 运行"sudo vmware-toolbox"(需要root权限) 2.选择“shrink”选项卡 3.选中“/”&#xff0c;点击“shrink”按钮 4.完…