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中不支持的话就会受到影响。(所有的第三方都存在这个问题)
使用场景
- 不建议开发中间件的项目使用,中间件设计的要求是解耦少依赖
- 业务项目实体类可以用,且用的时候知道对应的常见的注解原理
![微信公众号二维码](https://images.cnblogs.com/cnblogs_com/aeolian/1679458/o_wechat_gzh_qrcode.jpg)