草庐IT

Lombok-全面详解(学习总结---从入门到深化)

童小纯 2024-05-03 原文

目录

Lombok概述

Lombok插件安装 

 Lombok依赖

 Lombok注解_@Setter、@Getter

 Lombok注解_@ToString

 Lombok注解_@EqualsAndHashCode

Lombok注解_@NonNull 

 Lombok注解_@NoArgsConstructor

Lombok注解_@RequiredArgsConstructor 

 Lombok注解_@AllArgsConstructor

Lombok注解_@Data 

Lombok注解_@Builder 

Lombok注解_@Log

Lombok注解_@Cleanup 

Lombok注解_@SneakyThrows 

Lombok概述

以前的Java项目中,充斥着太多不友好的代码:POJO的 getter/setter/toString/构造方法;打印日志;I/O流的关闭操作等 等,这些代码既没有技术含量,又影响着代码的美观,Lombok应 运而生。

LomBok可以通过注解,帮助开发人员消除JAVA中尤其是POJO类中 的冗长代码。

1、使用LomBok之前

 2、使用LomBok之后

Lombok插件安装 

如果IDEA版本在2020.3以上,不需要安装Lombok插件。如果IDEA 版本在2020.3以下,需要安装Lombok插件,安装方法如下:

1、点击Flie->Setting->Plugins

2、搜索Lombok,安装

 Lombok依赖

1、普通maven项目Lombok依赖为:

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

2、SpringBoot项目Lombok的引入方式为:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

 Lombok注解_@Setter、@Getter

 作用:为类中的属性提供setter/getter方法

 位置:类上方或属性上方,在属性上方则为属性生成setter/getter 方法,在类上方表示给该类下的所有属性生成setter/getter方法

属性:设置setter和getter访问权限

//给类下的所有属性添加Setter/Getter
@Setter
@Getter
public class User {
    //给id属性添加Setter
    @Setter
    private Integer id;
    //给username的setter方法设置私有权限
    @Setter(AccessLevel.PRIVATE)
    private String username;
    //取消password的Getter方法
    @Getter(AccessLevel.NONE)
    private String password;
    private static int age;
    private final String address = null;
}

注: 1、static修饰的变量不生成getter和setter方法

         2、final修饰的变量只生成getter方法

在IDEA中,按住 Alt+7 可以查看Lombok生成的代码

 Lombok注解_@ToString

 作用:生成toString方法,默认情况下它会按顺序打印类名称以及 每个字段。

 位置:类上方

 属性:

1、exclude:取消某一个或多个变量在toString方法中的显示

@Setter
@Getter
//给User2设置一个toString方法,该方法不会显示password的值
@ToString(exclude = {"password"})
public class User2 {
    private Integer id;
    private String username;
    private String password;
}

 Lombok注解_@EqualsAndHashCode

 判断两个对象是否相等

在Java中,调用equals()可以判断两个对象是否相等。如果类不重写 该方法,则判断两个引用是否指向同一个对象。

如何重写equals():

1、判断两个引用是否指向同一对象

2、判断引用是否为Null

3、判断两个对象的实际类型是否相等,此时需要调用canEqual()

4、判断两个对象的属性是否相等

而在Set中判断对象是否重复,在调用equals()之前,需要先调用 hashCode()计算hash值。所以判断对象相等需要重写equals()、 canEqual()、hashCode()三个方法。

 @EqualsAndHashCode

作用:生成equals和hashCode、canEqual方法。用于比较两个类 对象是否相同。

位置:类上方

属性:

1、exclude: 比较时排除一些属性
2、of: 比较时只使用一些属性
@Setter
@Getter
@ToString
//@EqualsAndHashCode(exclude = {"password"})
//排除password,只使用id,username对比及计算hash
@EqualsAndHashCode(of = {"username"})
//只使用username对比及计算hash
public class User3 {
    private Integer id;
    private String username;
    private String password;
}

注意:

1、对比时只使用非静态属性

2、默认仅使用该类定义的属性不比较父类定义的属性

Lombok注解_@NonNull 

 作用:用于方法参数前,表示调用该方法时参数不能为null;用于 属性上方,表示为该属性赋值时值不能为null。

位置:方法参数前或属性上方。

@Setter
@Getter
public class User4 {
    // 调用构造方法或setter给id赋值时,值不能为null
    @NonNull
    private Integer id;
    private String username;
    private String password;
    // 调用sleep方法时,time参数不能为null
    public void sleep(@NonNull Integer time)
   {
        System.out.println("睡觉");
   }
}
// 测试
@SpringBootTest
public class UserTest {
    @Test
    public void testUser() {
        User4 user = new User4();
        user.setId(null);
        user.sleep(null);
   }
}

 Lombok注解_@NoArgsConstructor

 作用:生成无参构造方法

 位置:类上方

Lombok注解_@RequiredArgsConstructor 

作用:生成包含final和@NonNull修饰的属性的构造方法

位置:类上方

 Lombok注解_@AllArgsConstructor

作用:生成全参的构造方法

位置:类上方

@Setter
@Getter
//@NoArgsConstructor // 给类提供无参构造方法
@RequiredArgsConstructor // 生成两个username和sex参数的构造方法
@AllArgsConstructor//提供全参构造方法
public class User5 {
    @NonNull
    private Integer id;
    private String username;
    private String password;
    private final String sex;
}

Lombok注解_@Data 

作用:相当于同时添加@Setter、@Getter、@ToString、 @EqualsAndHashCode、 @RequiredArgsConstructor五个注解

位置:类上方 

Lombok注解_@Builder 

作用:提供链式风格创建对象

位置:类上方

// 同时提供@Setter、@Getter、@ToString、
@EqualsAndHashCode、@RequiredArgsConstructor
@Data
// 提供链式风格创建对象
@Builder
public class User6 {
    @NonNull
    private Integer id;
    private String username;
    private String password;
}
// 测试
@Test
public void testUser() {
    User6 user6 = User6.builder()
       .id(1)
       .username("itbaizhan")
       .password("itbaizhan")
       .build();
}

Lombok注解_@Log

 作用:在类中生成日志对象,在方法中可以直接使用

 位置:类上方

@Data
@Log4j2
public class User7 {
    private Integer id;
    private String username;
    private String password;
    public void sleep(){
        log.info("调用睡觉方法");
        System.out.println("睡觉");
   }
}

注:针对不同的日志实现产品,有不同的日志注解,使用 @Log 表示使用Java自带的日志功能,除了 @Log ,还可以使用 @Log4j 、 @Log4j2 、 @Slf4j 等注解,来使用不同的日志产品。

Lombok注解_@Cleanup 

作用:自动关闭资源,如IO流对象。

位置:代码前方

Lombok注解_@SneakyThrows 

作用:对方法中异常进行捕捉并抛出

位置:方法上方

@SneakyThrows
public void read() {
    @Cleanup FileInputStream fis = new FileInputStream("");
}

有关Lombok-全面详解(学习总结---从入门到深化)的更多相关文章

  1. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  2. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  3. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  4. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  5. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  6. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  7. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  8. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  9. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  10. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

随机推荐