onX
哥们,我们听说你喜欢注解,所以我们在你的注解里放了注解,这样你就可以一边注解一边注解了。
onX 在 lombok v0.11.8 版本中作为实验性功能引入。
实验性
实验性的原因:- 丑陋的语法。此功能的语法不是最优的,但它是目前可能工作的最不复杂的语法(目前!)。
- 可能 java 9 会提供(更好)的方式来支持此功能。
- 不确定性:未来版本的 javac 可能会破坏此功能,我们可能无法恢复它。
概述
此功能被认为是“权宜之计” - 它的存在是为了允许 Lombok 的用户在没有此功能就无法工作的情况下仍然可以使用它。如果我们找到更好的方法来实现此功能,或者未来的 java 版本引入了替代策略,则此功能可能会在没有合理的弃用期的情况下消失。此外,此功能可能在未来版本的 javac 中不起作用。请自行决定是否使用。
大多数使 Lombok 生成方法或构造函数的注解都可以配置为也使 Lombok 在生成的代码中的元素上放置自定义注解。
@Getter
、@Setter
和 @Wither
支持 onMethod
选项,该选项会将列出的注解放在生成的方法上。
@AllArgsConstructor
、@NoArgsConstructor
和 @RequiredArgsConstructor
支持 onConstructor
选项,该选项会将列出的注解放在生成的构造函数上。
@Setter
和 @Wither
除了 onMethod
之外还支持 onParam
;列出的注解将放在生成的方法拥有的唯一参数上。@EqualsAndHashCode
也支持 onParam
;列出的注解将放在生成的 equals
方法的单个参数以及任何生成的 canEqual
方法的单个参数上。
语法有点奇怪,并且取决于您使用的 javac。
在 javac7 上,要使用 3 个 onX
功能中的任何一个,您必须将要应用于构造函数/方法/参数的注解包装在 @__(@AnnotationGoesHere)
中。要应用多个注解,请使用 @__({@Annotation1, @Annotation2})
。注解本身显然也可以有参数。
在 javac8 及更高版本上,您在 onMethod
、onParam
或 onConstructor
之后添加一个下划线。
使用 Lombok
import lombok.AllArgsConstructor;
|
原生 Java
import javax.inject.Inject;
|
支持的配置键
-
lombok.onX.flagUsage
= [warning
|error
] (默认值:未设置) - 如果配置,Lombok 将把任何
onX
的使用标记为警告或错误。
小字印刷
奇怪语法的原因是为了使此功能在 javac 7 编译器中工作;@__
类型是对实际上不存在的注解类型 __
(双下划线)的注解引用;这使得 javac 7 由于错误而延迟中止编译过程,因为它可能注解处理器稍后会创建 __
类型。相反,Lombok 应用注解并删除引用,以便永远不会实际发生错误。重点是:__
类型必须不存在,否则该功能不起作用。在极少数情况下,__
类型确实存在(并且已导入或在包中),您可以简单地添加更多下划线。从技术上讲,任何不存在的类型都可以工作,但为了保持一致性和可读性并捕获错误使用,如果“包装器”注解不是一系列下划线,Lombok 会将其视为错误。
在 javac8 中,上述功能应该可以工作,但由于 javac8 中的一个错误,它不起作用。但是,从 javac8 开始,如果注解类型中不存在参数名称,则编译将进入 Lombok 可以修复它的阶段。
重申一下:此功能可能随时消失;如果您使用此功能,请做好准备,当我们找到更好的方法来实现此功能时,或者如果未来版本的 javac 迫使我们完全删除此功能且没有替代方案时,请调整您的代码。
onX
参数在任何类型范围变体上都不合法。例如,类上的 @Getter
注解不支持 onMethod
。