Fork me on GitHub

Lombok

Lombok

pom坐标scope为provided,因为lombok作用于编译阶段。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.16</version>
    <scope>provided</scope>
</dependency>

注解

@Getter/@Setter

作用于类和属性,自动产生 getter/setter。
注意:
AccessLevel属性设置生成方法的访问级别public/protected/private/none(不生成);
final字段只会生成get;
static静态成员变量不会生成set/get方法。

@NoArgsConstructor

@NoArgsConstructor : 生成一个没有参数的构造器

@AllArgsConstructor

@AllArgsConstructor : 生成一个包含所有参数的构造器

@RequiredArgsConstructo

@RequiredArgsConstructo :生成一个包含 “特定参数” 的构造器,特定参数指的是那些有加上 final 修饰词的变量,如果所有的变量都是正常的,都没有用 final 修饰的话,那就会生成一个没有参数的构造器

@ToString

自动重写 toString() 方法,会印出所有变量。
可以使用exclude和of排除或指定返回哪些属性。

@EqualsAndHashCode

生成覆盖原有的 equals(Object other) 和 hashcode() 方法,包括所有非静态变量,可以通过exclude排除或of指定。

HashCode方法

顶级类Object的方法,所有类都继承Object,返回int类型。
根据一定的hash规则(存储地址、字段、长度等),映射成一个数值,即散列值。

Equals方法

顶级类Object的方法,所有类都集成Object,返回boolean类型。
根据自定义的匹配规则,用于匹配两个对象是否一样,逻辑如下:

判断地址是否一样
非空判断和class类型判断
强转
对象里面的字段一一匹配

解析

如果两个对象相等,那么它们的hashcode值一定相同(通过equals()比较返回true)

如果两个对象hashCode()相等,它们并不一定相等。在散列表中hashCode()相等,即两个键值对的哈希值相等。就出现所谓的哈希冲突场景,还需判断equals方法判断对象是否相等。

应用

在set中不可放入重复对象,重复对象的判断即是通过equals函数判断。

@NonNull

作用在方法参数或属性上,如果向参数传一个null值会抛异常。

@Data

整合包,只要加了 @Data 这个注解,等于同时加了以下注解
@Getter/@Setter
@ToString
@EqualsAndHashCode
@RequiredArgsConstructor
注意:@Data中默认的是@EqualsAndHashCode(callSuper=false),这时候生成equals方法只会比较子类的属性,不会考虑从父类继承的属性,无论父类属性访问权限是否开放,只要知道是否需要使用父类的属性即可,也提供定制化配置。如果需要比对父类的属性,除了@Data还需要加上@EqualsAndHashCode(callSuper=true)

@Value

也是整合包,但是他会把所有的变量都设成final的,其他的就跟 @Data 一样,等于同时加了以下注解:
@Getter (没有setter)
@ToString
@EqualsAndHashCode
@RequiredArgsConstructor

@Builder

自动生成流式 set 值写法,从此之后再也不用写一堆 setter 了
虽然只要加上 @Builder 注解,我们就能够用流式写法快速设定对象的值,但是 setter 还是必须要写不能省略的,因为 Spring 或是其他框架有很多地方都会用到对象的 getter/setter 对他们取值/赋值 所以通常是 @Data 和 @Builder 会一起用在同个类上,既方便我们流式写代码,也方便框架做事。

@Slf4j

自动生成该类的 log 静态常量,要打日志就可以直接打,不用再手动 new log 静态常量了,不仅仅用于pojo,也可以用在service等类上。
@Log/@Slf4j

  • 作用域类上,生成日志变量,用于记录日志
  • 如果不生效,检查Setting - Annotation Processors - Enable annotation processing,更新重新lombok插件,重启idea。

原理

JSR269

JSR269: Pluggable Annotation Processing API
实现在javac编译阶段利用Annotation Processor对自定义的注解进行预处理后生成真正的JVM上面执行的“Class文件”。

Annotation Processing自定义注解是在编译阶段进行修改JDK的反射技术和JDK反射区别

Annotation Processing自定义注解是在编译阶段进行修改。
JDK的反射技术是在运行时动态修改。
结论: 反射更加灵活一些但是带来的性能损耗更大

优缺点

优点

  • 使用注解可以帮忙自动生成代码
  • 大大减少了代码量,使代码非常简洁
  • 部分注解在业务项目中开发能大大提高效率

缺点

  • Lombok的使用要求一定要在IDE中安装对应的插件,如果项目组中有一个人使用了Lombok则都要用。
  • 代码可读性低,可调试性低,比如想知道具体哪个类调用某个属性的getter方法。
  • 影响升级,如果升级到某个新版本的JDK的时候,如果其中的特性在Lombok中不支持的话就会受到影响。(所有的第三方都存在这个问题)

使用场景

  • 不建议开发中间件的项目使用,中间件设计的要求是解耦少依赖
  • 业务项目实体类可以用,且用的时候知道对应的常见的注解原理
posted @ 2022-07-20 13:12  秋夜雨巷  阅读(267)  评论(0编辑  收藏  举报