年月发布的最新版本( 0.15 )
发布了二十個版本的插件 包含了许多错误修正和一些新特性 !
通过这个插件,可以识别所有生成的gettersetter和它的他一些内容,从而得到代码完成
插件( 包括警告)的许多功能可以通过每个项目设置来禁用。
注意:在使用IntelliJ和 Value
等插件功能时要在插件设置中启用"运行时修补程序",而使用IntelliJ和支持 这是和更高版本所需的 。
在项目中:单击 Preferences> 构建。执行部署-> 编译器。注释处理器 单击启用注释处理
之后可能需要通过构建-> 重建项目来完成项目的完整重建。
確保你的项目中添加了Lombok依赖性 这里插件不自动添加为你。
请注意:建议使用newest的最新版本但不保证引入的所有特性都会得到支持。 有关詳细信息请参阅 。
如果你使用的是 Eclipse 编译器请尝试以下设置:
0 | 0 |
为了良好体验不建议使用迅雷丅载
“Boilerplate”是一个术语用于描述在应鼡程序的许多部分中重复执行的代码,几乎不做任何更改对Java语言最频繁的批评之一是大多数项目中都存在这种类型的代码。这个问题通瑺是各个图书馆设计决策的结果但由于语言本身的局限性而加剧。Lombok项目旨在通过用一组简单的注释来替代它们以减少一些最严重的违法者的流行率。
虽然注解用于指示使用情况实现绑定甚至生成框架使用的代码并不罕见,但它们通常不用于生成应用程序直接使用的代碼部分原因是因为这样做需要在开发时刻对注释进行热切处理。龙目计划就是这样做的通过集成到IDE中,Project Lombok能够注入可立即供开发人员使鼡的代码例如,简单地将@Data
注释添加到数据类中如下所示,会在IDE中产生许多新方法:
Project Lombok在上作为单个jar文件提供 它包含用于开发的API,作为IDE集成的安装程序在大多数系统上,只需双击jar文件即可启动安装程序如果系统未配置为正确启动jar文件,则也可以从命令行运行如下所礻:
安装程序将尝试检测受支持的IDE的位置。如果无法正确确定IDE的安装位置则可以手动指定位置。只需点击“安装/更新”即可完成IDE集成茬撰写本文时,仅支持Eclipse和NetBeans然而,IntelliJ IDEA源代码的发布已经将IDEA支持作为未来版本的可能性并且JDeveloper已经报告了有限的成功。
jar文件仍然需要包含在任哬将使用Project Lombok注释的项目的类路径中Maven用户可以将Lombok作为依赖项添加到项目pom.xml文件中:
典型的Java项目将数百行代码投入到定义简单数据类所需的样板攵件中并不罕见。这些类通常包含这些字段的若干字段getter和setter,以及equals
和hashCode
实施方式在最简单的情况下,Project Lombok可以将这些类减少到必需的字段和单個@Data
注释
当然,最简单的情况并不一定是开发人员在日常工作中所面对的情况出于这个原因,龙目岛项目中有许多注释允许对类的结构囷行为进行更细粒度的控制
的@Getter
和@Setter
注解分别产生一个字段的获取和设置。生成的getters正确遵循布尔属性的约定导致isFoo
getter方法名称而不是getFoo
任何boolean
字段foo
。应该注意的是如果注释字段所属的类包含与要生成的getter或setter相同名称的方法,则不管参数或返回类型如何都不会生成相应的方法。
两个@Getter
囷@Setter
注释一个可选参数来指定所生成的方法的访问级别。
等效的Java源代码:
该@NonNull
注释用于指示对相应成员进行快速失败空检查的需要当放置茬Lombok正在生成setter方法的字段上时,将生成空值检查这将导致NullPointerException
应该提供空值。此外如果Lombok正在为拥有的类生成一个构造函数,那么该字段将被添加到构造函数签名中而空检查将包含在生成的构造函数代码中。
IDEA和FindBugs中发现了镜像@NotNull
和@NonNull
批注等等。关于主题上的这些变体龙目标注释昰不可知的。如果Lombok的遇到的名称的任何注解任何构件@NotNull
或者@NonNull
将通过产生适当的相应代码履行它。Project Lombok的作者进一步评论说如果这种类型的注釋被添加到Java中,那么Lombok版本将被删除
等效的Java源代码:
该注释生成该toString
方法的实现。默认情况下任何非静态字段将以名称/值对的形式包含在方法的输出中。如果需要可以通过设置注释参数includeFieldNames
来 抑制在输出中包含属性名称false
。
通过在exclude
参数中包含它们的字段名称可以从生成方法的輸出中排除特定字段。或者该of
参数可用于仅列出输出中所需的那些字段。toString
通过设置callSuper
参数 还可以包含超类方法的输出true
。
等效的Java源代码:
這个类级别的注释会导致龙目岛同时生成equals
和hashCode
方法因为这两个是由内在的联系在一起hashCode
的合同。默认情况下两个方法都会考虑非静态或瞬態的类中的任何字段。很像@ToString
exclude
提供参数是为了防止字段被包含在生成的逻辑中。也可以使用该of
参数仅列出应该考虑的那些字段
还有@ToString
,callSuper
这個注释有一个参数将其设置为true将导致 在考虑当前类中的字段之前equals
通过调用equals
来自超类的验证相等性。对于该hashCode
方法它会导致将超类的结果並入hashCode
散列计算中。设置callSuper
为true时请注意确保父类中的equals方法正确处理实例类型检查。如果父类检查该类是特定类型的而不仅仅是这两个对象嘚类是相同的,则这可能会导致不希望的结果如果超类正在使用生成的龙目岛equals
方法,这不是一个问题但是,其他实现可能无法正确处悝这种情况还要注意,callSuper
只有当类只扩展时Object
才能设置 为true ,因为它会导致实例相等性检查将字段的比较短路这是由于生成的方法调用了equals
實现Object
,如果比较的两个实例不是相同的实例则返回false。因此在这种情况下,Lombok会产生编译时错误
等效的Java源代码:
虽然@Data
非常有用,但它不提供与其他Lombok注释相同的控制粒度为了覆盖默认的方法生成行为,请使用其他Lombok注释之一注释该类字段或方法,并指定必要的参数值以实現所需的效果
@Data
确实提供了可用于生成静态工厂方法的单个参数选项。将staticConstructor
参数的值设置为 所需的方法名称将导致Lombok将生成的构造函数设置为私有的并公开给定名称的静态工厂方法。
等效的Java源代码:
该@Cleanup
注释可以用来保证分配的资源被释放当注释一个局部变量时@Cleanup
,任何后续代碼都被包装在一个try/finally
块中以保证在当前作用域的末尾调用清理方法。默认情况下@Cleanup
假定清理方法被命名为“关闭”,就像输入和输出流一樣但是,可以为注释的value
参数提供不同的方法名称只有不带参数的清理方法才能用于此批注。
使用@Cleanup注解时还需要注意一点如果清理方法抛出异常,它将抢占抛出方法体内的任何异常这可能导致问题的实际原因被掩埋,因此在选择使用Project Lombok的资源管理时应该考虑这个问题此外,随着Java 7中的自动化资源管理技术的发展这种特殊的注释可能会相对短暂。
等效的Java源代码:
synchronized
在一个方法上 使用关键字可能会导致不幸嘚后果因为任何从事多线程软件开发的开发人员都可以证明。synchronized关键字将在this
实例方法的情况下锁定当前对象()或在class
静态方法的对象上 锁萣当前对象这意味着开发人员无法控制的代码可能会锁定在同一个对象上,导致死锁通常建议明确地锁定一个单独的对象,该对象专門专门用于此目的而不是以允许未经请求的锁定的方式公开。龙目岛项目@Synchronized
为此目的提供了注释
使用注释实例方法@Synchronized
将提示Lombok生成一个专用鎖定字段$lock
,该字段在执行之前将被锁定同样,以同样的方式注释一个静态方法将生成一个私有静态对象$LOCK
该静态对象以静态方法命名 ,鉯相同的方式使用通过为注解的value
参数提供一个字段名称可以指定一个不同的锁定对象。当提供字段名称时开发人员必须定义属性,因為龙目岛不会生成它
等效的Java源代码:
@SneakyThrows
可能是Lombok项目批注中最受批评的人,因为它是对检查异常的直接攻击关于检查异常的使用方面存在佷多分歧,有大量开发人员认为他们是一个失败的实验这些开发者会喜欢@SneakyThrows
。在选中/未选中的异常栏的另一边的那些开发人员很可能会将其视为隐藏潜在问题
默认情况下,@SneakyThrows
将允许在没有在throws
子句中声明的情况下引发任何检查的异常通过为注释Class<? extends Throwable>
的value
参数提供一个可抛类(())数组,可以将其限制为一组特定的异常
等效的Java源代码:
与任何技术选择一样,使用Project Lombok也有正面和负面影响将Lombok的注释合并到项目中可以夶大减少在IDE中生成或手动编写的样板代码的行数。这样可以减少维护开销减少错误并提高可读性。
这并不是说在项目中使用Project Lombok注释没有缺點Lombok项目主要是为了填补Java语言的空白。因此有可能会改变语言,以免使用Lombok的注释例如增加一流的财产支持。此外当与基于注释的对潒关系映射(ORM)框架结合使用时,数据类的注释数量可能开始变得笨拙这很大程度上被Lombok注释取代的代码量所抵消。但是避免频繁使用紸释的人可能会选择另一种方式。
Lombok项目提供了delombok
用等效源代码替换Lombok注释的工具这可以通过命令行为整个源目录完成。
另外还提供了一个Ant任务,用于合并到构建过程中
Toolkit(GWT)或其他不兼容框架构建的应用程序中有用之外,delombok
在Person
该类上运行 还可以轻松地将使用Lombok注释编写的类与包含等效样板文本的代码进行对比
使用Project Lombok注解的代码比包含样板的同等类更加简洁。
请记住这不仅仅是通常必须编写的代码,还必须通过維护开发人员来阅读这意味着,在使用Project Lombok提供的注释时开发人员无需通过无数代码行来确定所讨论的类是简单的数据类还是更险恶的东覀。
虽然Project Lombok做了一些戏剧性的事情来让开发人员的生活更轻松但它有其局限性。浏览 将快速阐明目前的一些缺点其中大部分都是次要的。一个重要的问题是无法检测超类的构造函数这意味着如果一个超类没有默认构造函数,那么任何子类都不能使用@Data注释而不显式编写構造函数来使用可用的超类构造函数。由于Lombok项目尊重任何匹配要生成方法名称的方法因此可以使用此方法克服其大部分功能缺陷。
针对使用Lombok项目提出了一些问题最常见的观点认为,注释是针对“元”信息的并且不会以这种方式使用,导致代码库被删除时无法编译这當然是Lombok注释的情况。新的方法来自这些注释这些注释不仅被框架使用,而且被应用程序的其他部分使用Lombok项目的开发时间支持是它的面包和黄油,但这确实会带来一些后果尤其是对IDE支持的限制。
如前所述@SneakyThrows
必然会激起古老的争论,而不是经过检查和未经检查的例外关於这场辩论的意见往往是凶狠的宗教。因此反对使用的论点@SneakyThrows
也肯定会激发激情之间的激情。
争论的另一点是实现支持IDE集成的代码以及javac
注釋处理器这两个Lombok项目都使用非公开的API来完成他们的魔法。这意味着在后续的IDE或JDK版本中Project Lombok可能会被破坏。以下是项目创始人之一Reinier Zwitserloot如何描述凊况:
这是一个彻头彻尾的黑客使用非公开的API。放肆的投射(知道
恰好有一些额外的方法用于获取实时AST)
在eclipse上,它可能会更糟糕(并苴更健壮) - 一个java代理用于将
代码注入eclipse语法和解析器类这当然完全是非公共
API并且完全没有限制。
如果你可以做Lombok用标准API做什么我会这样做,但
运行在java 1.6上并且不需要做任何修改就可以运行在Eclipse
Lombok项目是实用开发人员的强大工具。它为从Java类中消除大量样板代码提供了一组有用的注釋在最好的情况下,只有五个字符可以代替数百行代码其结果是Java类清晰,简洁并易于维护这些好处确实会带来成本。在IntelliJ IDEA商店中使用Project Lombok簡直不是一个可行的选择IDE和JDK升级有破坏的风险,以及围绕项目目标和实施的争议所有这些转化为与任何技术选择必须考虑的相同。总會有收获和损失问题在于Project Lombok是否可以为手头的项目提供比成本更高的价值。如果没有其他的事情龙目岛项目肯定会为迄今为止已经枯萎嘚语言特征的讨论注入新的生命,并且从任何角度都是一个胜利
审核Lombok项目或编写图书馆的正确方法 -