lombok基础

强大的lombok插件

原文:https://blog.csdn.net/love_caicai/article/details/82356438
参考:https://projectlombok.org/features/Data

最近做一个项目,发现实体类中仅仅只是定义了变量,没有任何setter,getter,方法,也没有构造函数,但是却可以正常的调用,仔细查看后发现类上比之前所见的类多了一些注解,@Data,@EqualsAndHashCode.经过多方查找,终于大概弄明白了,现在写出来一方面巩固自己所学,顺便供大家参考,有说的不好的地方,欢迎大家指出,共同进步…

一、Lombok是什么

现在看一下Lombok官方对其进行的解释:Lombok官网:https://projectlombok.org

Lombok项目是一种自动接通你的编辑器和构建工具的一个Java库。不用再一次写额外的getter或者equals方法。由此可以看出,lombok会帮我们自动生成getter和euqals方法,但是更有意思的是,当我们的变量发生改变时,我们不再需要修改对的getter、setter方法,lombok帮我们在运行的过程中自动生成上述方法,编码更灵活.

所以,使用lombok的优点:
1、简化long冗余的javabean代码;
2、提高执行效率

二、如何使用Lombok

1.lombok插件的安装

1.1 首先我们需要安装IntelliJ IDEA中的lombok插件,打开IntelliJ IDEA后点击菜单栏中的File–>Settings,或者使用快捷键Ctrl+Alt+S进入到设置页面。

在这里插入图片描述

1.2 我们点击设置中的Plugins进行插件的安装,在右侧选择Browse repositories…,然后在搜索页面输入lombok变可以查询到下方的Lombok Plugin,鼠标点击Lombok Plugin可在右侧看到Install按钮,点击该按钮便可安装。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3我们在安装页面可以看到lombok具体支持的所有注解,在安装过程中有Downloading Plugins的提示,安装过程中进度条会变化。需要提醒的是,在安装过程中一定要保证网络连接可用且良好,否则可能会安装失败。安装成功后我们可以看到右侧的Restart按钮,此时可先不操作,因为我们还有后续的配置工作。安装完成后我们再回到Plugins,此时在右侧可以搜索到lombok,而安装前是不行的。

在这里插入图片描述

2. 引入依赖:(版本自行选择)

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
        </dependency>

3.创建实体类

package com.Day5;

import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
import lombok.Data;

import java.io.Serializable;

@Data//这个是lombok插件(推荐)添加此注解相当于是get,set,toString等一次性全部自动生成
@ExcelTarget("studentEntity")
public class Student implements Serializable
{
    private static final long serialVersionUID = 1L;
    @Excel(name = "序号",isImportField = "true",orderNum = "1")
    private Integer serialNum;
    @Excel(name = "学校",isImportField = "true",orderNum = "2")
    private String schoolName;
    @Excel(name = "姓名",isImportField = "true",orderNum = "3")
    private String studentName;
    @Excel(name = "右眼",isImportField = "true",orderNum = "4")
    private String odVision;
    @Excel(name = "左眼",isImportField = "true",orderNum = "5")
    private String osVision;
}

4.测试

package com.Day5;

/**
 * @author 
 * @create 2020-07-07 18:13
 */
public class Test
{
    public static void main(String[] args)
    {
        Student student = new Student();
        student.setStudentName("张三");
        student.setSchoolName("清华大学");
        student.setSerialNum(1);
        student.setOdVision("5.0");
        student.setOsVision("5.0");
        System.out.println(student);
    }
}

5.打印结果:


Student(serialNum=1, schoolName=清华大学, studentName=张三, odVision=5.0, osVision=5.0)

Process finished with exit code 0

是不是感觉lombok很强大,事实也是如此

三、lombok中的常用注解

  • @Setter :在JavaBean或类JavaBean中使用,使用此注解会生成对应的setter方法;
  • @Getter:在JavaBean或类JavaBean中使用,使用此注解会生成对应的getter方法;
  • @ToString:在JavaBean或类JavaBean中使用,使用此注解会自动重写对应的toStirng方法;
  • @NoArgsConstructor:在JavaBean或类JavaBean中使用,使用此注解会生成对应的无参构造方法;
  • @HashCode:
  • @Equals:
  • @CanEqual:
  • @Data:在JavaBean或类JavaBean中使用,这个注解包含范围最广,它包含上述注解,即当使用当前注解时,会自动生成包含的所有方法;
  • @AllArgsConstructor:在JavaBean或类JavaBean中使用,使用此注解会生成对应的有参构造方法;
  • @Log(这是一个泛型注解,具体有很多种形式)
  • @EqualsAndHashCode:在JavaBean或类JavaBean中使用,使用此注解会自动重写对应的equals方法和hashCode方法;
  1. 此注解会生成equals(Object other) 和 hashCode()方法。

  2. 它默认使用非静态,非瞬态的属性

  3. 可通过参数exclude排除一些属性

  4. 可通过参数of指定仅使用哪些属性

  5. 它默认仅使用该类中定义的属性且不调用父类的方法

  6. 可通过callSuper=true解决上一点问题。让其生成的方法中调用父类的方法。

  • @Slf4j:在需要打印日志的类中使用,当项目中使用了slf4j打印日志框架时使用该注解,会简化日志的打印流程,只需调用info方法即可;
  • @Log4j:在需要打印日志的类中使用,当项目中使用了log4j打印日志框架时使用该注解,会简化日志的打印流程,只需调用info方法即可;

在使用以上注解需要处理参数时,处理方法如下(以@ToString注解为例,其他注解同@ToString注解)
@ToString(exclude=“column”)

意义:排除column列所对应的元素,即在生成toString方法时不包含column参数;

@ToString(exclude={“column1”,“column2”})

意义:排除多个column列所对应的元素,其中间用英文状态下的逗号进行分割,即在生成toString方法时不包含多个column参数;

@ToString(of=“column”)

意义:只生成包含column列所对应的元素的参数的toString方法,即在生成toString方法时只包含column参数;;

@ToString(of={“column1”,“column2”})

意义:只生成包含多个column列所对应的元素的参数的toString方法,其中间用英文状态下的逗号进行分割,即在生成toString方法时只包含多个column参数;

@Data 一般和@EqualsAndHashCode同时使用,因为:

通过官方文档,可以得知,当使用@Data注解时,则有了@EqualsAndHashCode注解,那么就会在此类中存在equals(Object other) 和 hashCode()方法,且不会使用父类的属性,这就导致了可能的问题。

比如,有多个类有相同的部分属性,把它们定义到父类中,恰好id(数据库主键)也在父类中,那么就会存在部分对象在比较时,它们并不相等,却因为lombok自动生成的equals(Object other) 和 hashCode()方法判定为相等,从而导致出错。

  1. 使用@Getter @Setter @ToString代替@Data并且自定义equals(Object other) 和 hashCode()方法,比如有些类只需要判断主键id是否相等即足矣。

  2. 或者使用在使用@Data时同时加上@EqualsAndHashCode(callSuper=true)注解。


三、基本注解的使用(注解属性非必选)
@AllArgsConstructor:作用于类,生成参数为所有实例变量的构造函数
@Builder:作用于类,将其变成建造者模式
@Cleanup:作用于变量,自动关闭资源,针对实现了 java.io.Closeable 接口的对象有效
@CustomLog:自定义日志类,生成 log 对象
@Data:作用于类,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor
@EqualsAndHashCode:作用于类,覆盖默认的 equals 和 hashCode1
@Generated:用于标记类、变量、方法是自动生成的,没什么大用
@Getter:作用于类,生成该类所有的实例变量的 getter 方法。作用于变量,生成变量的 getter 方法
@NoArgsConstructor:作用于类,生成无参构造方法
@NonNull:作用于成员变量和参数中,标识不能为空,否则抛出空指针异常
@RequiredArgsConstructor:作用于类,生成包含 final 和 @NonNull 注解的成员变量的构造方法
@Setter:作用于类,生成该类所有的实例变量的 setter 方法。作用于变量,生成该变量的 setter 方法
@Singular:作用于集合字段,需要配合 @Builder 使用2
@SneakyThrows:作用于方法,对异常进行捕捉并抛出
@Synchronized:作用于方法,可以替换 synchronized 关键字或 lock 锁
@ToString:作用于类,覆盖默认的 toString() 方法
@val:作用于类、变量,主要用于声明变量的类型,注解将从初始化程序表达式中推断类型,生成的变量是 final 不可以变
@Value:作用于类,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @RequiredArgsConstructor
@var:和 @val 一样,两者区别在于 var 不加 final
@With:作用于类、变量,生成 with + 变量名的方法,返回当前对象
四、外部注解的使用
@CommonsLog,@Log,@JBossLog,@Log4j,@Log4j2,@Slf4j,@XSlf4j:日志注解,作用于类
五、实验性注解的使用
@Accessors:类似于 @Builder 支持链式调用,需要配合 @Setter、@Getter 等注解使用,作用于类、变量
@Delegate:作用于容器变量,为该变量生成一堆常用的方法,这些方法都是容器中的方法
@ExtensionMethod:作用于类,向类添加方法,无需创建新的子类
@FieldDefaults:作用于类,定义变量的访问修饰符以及是否加 final
@FieldNameConstants:作用于类,生成一个包含所有成员变量的内部类或者内部枚举,内部类中每个字段值即为字段名并且值不可变
@Helper:作用于方法内部类,使内部类中的方法暴露在外面可以被直接调用,不建议使用
@NonFinal:作用于类、变量,表示变量不加 final
@PackagePrivate:作用于类和变量,相当于访问修饰符的 default,没什么用
@SuperBuilder:支持对于基类成员变量赋值,算是 @Builder 的升级版
@Tolerate:实现对冲突的兼容,作用于方法上,没什么大用,可以配合 @Builder 使用
@UtilityClass:作用于类,将类标记为 final,并且类、内部类中的方法、字段都标记为 static
@WithBy3
六、基于 v1.18.22 版本的实验性注解
@StandardException:自定义异常类
七、Lombok 的优缺点
优点:
能通过注解的形式自动生成构造器、getter / setter、equals、hashcode、toString 等方法,提高了一定的开发效率
让代码变得简洁,不用过多的去关注相应的方法
属性做修改时,也简化了维护为这些属性所生成的 getter / setter 方法等

缺点:
不支持多种参数构造器的重载
虽然省去了手动创建一系列方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度

八、待完善的
@EqualsAndHashCode.Include(replaces = “”) ↩︎

@Singular 中的 ignoreNullCollections 属性待完善 ↩︎

@WithBy ↩︎

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值