Lombok学习
Lombok
官网介绍:
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
翻译:Project Lombok 是一个 Java 库,它会自动插入编辑器和构建工具,为您的 Java 增添趣味。永远不要再写另一个 getter 或 equals 方法,使用一个注释,您的类有一个功能齐全的构建器,自动化您的日志记录变量等等。
使用环境:
可以选择开发工具Idea或者Eclipse配合Maven来使用.
1.导入Lombok依赖
可以根据具体情况选择对应的版本
2.安装Lombok插件
注:有的版本是捆绑安装,有的需要安装
3.使用Lombok相关注解
3.1 @Data注解
-
@Data 是一个方便的快捷方式注释,它将 @ToString 、 @EqualsAndHashCode 、 @Getter / @Setter 和 @RequiredArgsConstructor 的功能捆绑在一起: 换句话说, @Data 生成通常与简单 POJO(普通旧 Java 对象)和 bean 关联的所有样板:所有字段的 getter,所有非最终字段的 setter,以及涉及类字段的适当 toString 、 equals 和 hashCode 实现, 以及初始化所有最终字段以及所有没有初始值设定项且已标记为 @NonNull 的非最终字段的构造函数,以确保该字段永远不会为 null。
-
@Data 就像在类上具有隐式的 @Getter 、 @Setter 、 @ToString 、 @EqualsAndHashCode 和 @RequiredArgsConstructor 注释(除非如果已经存在任何显式编写的构造函数,则不会生成构造函数)。但是,这些注释的参数(如 callSuper 、 includeFieldNames 和 exclude )不能用 @Data 设置。如果需要为这些参数中的任何一个设置非默认值,只需显式添加这些注释; @Data 足够聪明,可以遵从这些注释。
-
所有生成的 getter 和 setter 都将是 public 。要覆盖访问级别,请使用显式 @Setter 和/或 @Getter 注释对字段或类进行批注。您也可以使用此注释(通过将其与 AccessLevel.NONE 结合使用)来抑制生成 getter 和/或 setter。
-
标记为 transient 的所有字段都不会被考虑为 hashCode 和 equals 。所有静态字段将被完全跳过(不考虑任何生成的方法,也不会为它们创建 setter/getter)。
-
如果类已包含与通常生成的任何方法具有相同名称和参数计数的方法,则不会生成该方法,并且不会发出警告或错误。例如,如果您已经有一个带有签名 equals(AnyType param) 的方法,则不会生成 equals 方法,即使从技术上讲,由于具有不同的参数类型,它可能是一个完全不同的方法。相同的规则适用于构造函数(任何显式构造函数都将阻止 @Data 生成构造函数),以及 toString 、 equals 以及所有 getter 和 setter。您可以使用 @lombok.experimental.Tolerate 标记任何构造函数或方法以对龙目岛隐藏它们。
-
@Data 可以很好地处理字段的泛型参数。为了在为具有泛型的类构造对象时减少样板,可以使用 staticConstructor 参数生成私有构造函数以及返回新实例的静态方法。这样,javac 将推断出变量名。因此,通过像这样声明: @Data(staticConstructor="of") class Foo
{ private T x;} ,您可以通过编写: Foo.of(5); 来创建 Foo 的新实例,而不必编写: new Foo (5); 。
3.2 按顺序定制的构造函数:生成不带参数的构造函数@NoArgsConstructor,每个最终/非空字段一个参数 @RequiredArgsConstructor,或每个字段一个参数, @AllArgsConstructor
- @NoArgsConstructor 将生成一个没有参数的构造函数。如果这是不可能的(由于最终字段),则会导致编译器错误,除非使用 @NoArgsConstructor(force = true) ,否则所有最终字段都使用 0 / false / null 初始化。对于具有约束的字段(例如 @NonNull 字段),不会生成任何检查,因此请注意,在稍后正确初始化这些字段之前,通常不会满足这些约束。某些 Java 构造(如 hibernate 和 Service Provider Interface)需要 no-args 构造函数。此批注主要与 @Data 或其他生成批注的构造函数之一结合使用时有用。
- @RequiredArgsConstructor 为每个需要特殊处理的字段生成一个具有 1 个参数的构造函数。所有未初始化的 final 字段都会获取一个参数,以及标记为 @NonNull 且未在声明位置初始化的任何字段。对于那些标有 @NonNull 的字段,还会生成显式空检查。如果用于标记为 @NonNull 的字段的任何参数包含 null ,则构造函数将抛出 NullPointerException 。参数的顺序与字段在类中的显示顺序相匹配。
- @AllArgsConstructor 为类中的每个字段生成一个具有 1 个参数的构造函数。标有 @NonNull 的字段会导致对这些参数进行空检查。
4. 使用建议
具体情况具体搭配使用,需要注意的是当使用@Data注解时,则有了@EqualsAndHashCode注解,那么就会在此类中存在equals(Object other) 和 hashCode()方法,且不会使用父类的属性,这就导致了可能的问题。
比如,有多个类有相同的部分属性,把它们定义到父类中,恰好id(数据库主键)也在父类中,那么就会存在部分对象在比较时,它们并不相等,却因为lombok自动生成的equals(Object other) 和 hashCode()方法判定为相等,从而导致出错。
场景如下:
Person类
Student类
test类
解决办法:
使用注解@EqualsAndHashCode(callSuper = true) 考虑父类的
本文来自博客园,作者:大帅比韦小宝,转载请注明原文链接:https://www.cnblogs.com/yydsDW/p/17410178.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!