Lombok--知其然知其所以然

写在前面:

作为一个合格的java程序员,相信大家对lombok并不陌生。网上关于是否应该使用lombok的问题一直都存在,但这并不影响它是一个高效的java插件,本篇文章也并不会涉及讨论是否应该使用的问题。

一、简介

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.

以上是官网的介绍,一句话概括:lombok是一个高效、功能丰富的java库。

二、使用

1、 @Data注解

如果使用lombok插件,@Data注解应该是使用最多、最频繁的注解,同时它也是功能最强大的注解。

使用位置:类

使用方法:

我们可以通过下面的栗子来看看它的基本原理。

@Data注解

从编译前后的对比,我们可以看到@Data注解,不仅为我们生成了每个私有变量的get/set方法,还为我们生成了equals/canEqual/canEqual/hashCode/toString方法,如果官网所说,我们不需要再去写繁琐的get/set等方法了。

细心的同学可能发现了,我们定义的成员变量是private的,但是@Data注解编译之后生成的get/set方法都是public的,也就是说,它破坏了封装性。lombok也有相关的解决方案,我们往下看。

2、@AllArgsConstructor/@NoArgsConstructor

使用位置:类

使用方法:

@AllArgsConstructor注解一般和@Data注解一起使用,作用是为我们生成全参的构造函数,看下面的栗子。

@AllArgsConstructor注解

对比编译前后的代码,我们可以明显看到编译后的代码多了一个全参的构造函数。

与@AllArgsConstructor相似,@NoArgsConstructor的作用是生成一个无参的构造函数。

@NoArgsConstructor注解

@AllArgsConstructor和@NoArgsConstructor,前者生成全参构造函数,后者生成无参构造函数;如果我们想生成指定参数的构造函数怎么办呢?lombok也有相关的解决方案,我们往下看。

3、 @EqualsAndHashCode

使用位置:类

使用方法:

@EqualsAndHashCode注解顾名思义,就是在类上自动生成equals方法和hashCode方法,同时也会生成一个canEqual方法。今天想要聊的是关于继承中使用@EqualsAndHashCode注解。

Student类继承Person类,Person中有了自己的equals方法和hashCode方法,如果想在其子类Student中也使用equals方法和hashCode方法,此时要注意添加callSuper = true属性,默认callSuper为false。如上图,callSuper为true时,Student类中的 equals方法和hashCode方法,会兼顾父类的equals方法和hashCode方法,进而精准的去比较和计算。

callSuper = true时:

在这里插入图片描述

callSuper = false时:

在这里插入图片描述

举个栗子,如果callSuper为false,student的equals方法和hashCode方法不会兼顾父类,那么当前去对两个student实例对象进行比较的时候,具有相同班级号和学校的两个学生会被认为是一个学生,这显然是不符合常理的。所以当我们的实体类如果存在继承关系的时候,写在子类上的@EqualsAndHashCode注解的callSuper属性一定要为true。

4、@RequiredArgsConstructor

使用位置:类

使用方法:

@RequiredArgsConstructor注解和@AllArgsConstructor/@NoArgsConstructor是一组,它可以对类中所有带有 @NonNull 注解或者带有 final 修饰的成员变量生成一个构造函数。也就是说上面遗留的问题:如何对指定的成员变量生成构造函数?可以由此注解来实现。如下:

@RequiredArgsConstructor注解

如上图,我们可以在我们需要单独生成构造函数的成员变量上加上@NonNull注解或者使用final修饰,编译后就会生成带有指定参数的构造函数。

5、@Getter/@Setter

使用位置:成员变量

使用方法:

@Getter/@Setter注解会为指定的成员变量生成get/set方法,我们要讨论的是它相对于@Data注解不同的特点:它可以指定成员变量的访问范围,也就是解决我们上面所说的@Data破坏封装性的问题,通过AccessLevel属性可以对指定的成员进行访问范围控制,也就是我们常说的PROTECTED/PUBLIC/PRIVATE等。栗子如下:

在这里插入图片描述

6、@Builder

使用位置:多用在类

使用方法:

@Builder注解能让使用者像流程般那样链式的构造对象,而不再需要new。值得注意的是,该注解并不支持有继承关系的子类,官方推出了@SuperBuilder来试图解决这个问题,但现在还处于试验阶段。举个栗子:

@Builder注解

7、@NonNull

使用位置:成员变量

使用方法:

@NonNull注解主要用作成员变量的非空校验,其工作原理是对字段属性增加非空校验,同时会生成一个无参构造函数。举个栗子:

在这里插入图片描述

8、@SneakyThrows

使用位置:成员方法

使用方法:

@SneakyThrows可以将代码中的异常捕获到并原样抛出,所以避免了throw写法,其基本工作原理是将异常try-catch到,并在catch中重新throw。举个栗子:

@SneakyThrows

9、@UtilityClass

使用位置:类

使用方法:

@UtilityClass注解可以将非静态方法转换为静态方法,所以常用在工具类中,可避免每个方法写static关键字。其工作原理就是为每个成员方法加static关键字,同时会生成一个无法实例化校验的无参构造方法。举个栗子:

在这里插入图片描述

三、总结

java开发存在很多第三方的插件,我们不仅仅要会用,而且应该要知道它的原理,知道它是怎样帮助我们的。这样对插件的使用才会得心应手。借此篇文章希望能够帮助到大家,让大家对lombok插件有更深的理解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值