【精选】Lombok概述及常用注解使用方法

news2024/9/22 5:29:56

Lombok概述

在这里插入图片描述

Lombok项目是一个java库,它可以自动插入到编辑器和构建工具中,增强java的性能。不需要再写getter、setter或equals方法,只要有一个注解,就有一个功能齐全的构建器、自动记录变量等等。

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

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

  • 使用LomBok之前

在这里插入图片描述

  • 使用LomBok之后

在这里插入图片描述

Lombok插件安装

在这里插入图片描述

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

  1. 点击Flie->Setting->Plugins

  2. 搜索Lombok,安装

Lombok依赖

  • 普通maven项目Lombok依赖为:

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.22</version>
      <scope>provided</scope>
    </dependency>
    
  • 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;
}

注:

  • static修饰的变量不生成getter和setter方法
  • final修饰的变量只生成getter方法

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

@ToString

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

位置:类上方

属性:

  • exclude:取消某一个或多个变量在toString方法中的显示
@Setter
@Getter
//给User2设置一个toString方法,该方法不会显示password的值
@ToString(exclude = {"password"})
public class User2 {
  	private Integer id;
  	private String username;
  	private String password;
}

@EqualsAndHashCode

判断两个对象是否相等

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

如何重写equals():

  1. 判断两个引用是否指向同一对象
  2. 判断引用是否为Null
  3. 判断两个对象的实际类型是否相等,此时需要调用canEqual()
  4. 判断两个对象的属性是否相等

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

@EqualsAndHashCode

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

位置:类上方

属性:

  • exclude: 比较时排除一些属性
  • 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;
}

注意:

  • 对比时只使用非静态属性
  • 默认仅使用该类定义的属性不比较父类定义的属性

@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);
   }
}

@NoArgsConstructor

作用:生成无参构造方法

位置:类上方

@RequiredArgsConstructor

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

位置:类上方

@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;
}

@Data

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

位置:类上方

@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("lombok")
     .password("lombok")
     .build();
}

@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等注解,来使用不同的日志产品。

@Cleanup

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

位置:代码前方

@SneakyThrows

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

位置:方法上方

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1325429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2002年AMC8数学竞赛中英文真题典型考题、考点分析和答案解析

今天是2023年12月21日&#xff0c;距离2024年的AMC8正式考试倒计时已不足30天了。 六分成长继续和您一起&#xff0c;从历年的真题中来了解考试题型、考试形式、对知识点查漏补缺。如果您有任何关于AMC8比赛的任何问题都可以问我&#xff0c;关于题目的解析也可以交流。敲黑板…

Ansible的脚本----playbook剧本

Playbook组成部分 tasks 任务&#xff1a;包含要在目标主机上执行的操作&#xff0c;使用模块定义这些操作。每个任务都是一个模块的调用。Variables 变量&#xff1a;存储和传递数据。变量可以自定义&#xff0c;可以在playbook当中定义全局变量&#xff0c;可以外部传参。T…

ARM GIC(二)中断分类

一、中断状态 对于每一个中断而言,有以下4个状态: inactive:中断处于无效状态 pending:中断处于有效状态,但是cpu没有响应该中断 active:cpu在响应该中断 active and pending:cpu在响应该中断,但是该中断源又发送中断过来 以下是中断状态的转移图。至于图中的转移…

基于Redis限流(aop切面+redis实现“令牌桶算法”)

令牌桶算法属于流量控制算法&#xff0c;在一定时间内保证一个键&#xff08;key&#xff09;的访问量不超过某个阈值。这里的关键是设置一个令牌桶&#xff0c;在某个时间段内生成一定数量的令牌&#xff0c;然后每次访问时从桶中获取令牌&#xff0c;如果桶中没有令牌&#x…

U-MixFormer:用于高效语义分割的类unet结构的混合注意力Transformer

论文&#xff1a; 代码&#xff1a;GitHub - RecklessRonan/MuSE 感觉这篇比较优雅无痛涨点欸.....最近要期末了没时间看文章和做实验了&#xff08;摊 摘要 语义分割在Transformer架构的适应下取得了显著的进步。与Transformer的进步并行的是基于CNN的U-Net在高质量医学影…

数据可视化---直方图

内容导航 类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统…

HarmonyOS概述

HarmonyOS概述 HarmonyOS系统架构 内核层—系统服务层—框架层—应用层 内核层&#xff1a; 内核子系统: HarmonyOS采用多内核设计&#xff0c;支持针对不同资源受限设备 &#xff0c;选用适合的OS内核&#xff0c;为上层提供基础操作系统能力。驱动子系统: 硬件驱动框架(H…

【Spring Security】打造安全无忧的Web应用--入门篇

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Spring Security的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Spring Security是什么 1.概…

小鹅通基于 TSE 云原生 API 网关的落地实践

导语 2023腾讯全球数字生态大会已于9月7-8日完美落幕&#xff0c;40专场活动展示了腾讯最新的前沿技术、核心产品、解决方案。 微服务与消息队列专场&#xff0c;我们邀请到了小鹅通的基础架构组负责人黄徐震为我们带来了《小鹅通基于 TSE 云原生网关的落地实践》的精彩演讲。…

java 4.数组

文章目录 4.数组4.1数组的概念4.2 数组的定义4.3 数组的初始化4.4 数组下标的有效范围与常见异常4.5 数组内存分析4.6 二维数组4.6.1 创建二维数组4.6.2 二维数组的赋值4.6.3 多维数组4.6.4 通过二维数组输出不同版式的古诗 4.7 不规则数组4.8 数组的基本操作4.8.1 数组遍历4.8…

前后端分离下的鸿鹄电子招投标系统:使用Spring Boot、Mybatis、Redis和Layui实现源码与立项流程

在数字化时代&#xff0c;采购管理也正经历着前所未有的变革。全过程数字化采购管理成为了企业追求高效、透明和规范的关键。该系统通过Spring Cloud、Spring Boot2、Mybatis等先进技术&#xff0c;打造了从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通过…

hadoop格式化报错

在var/bigdata/hadoop/ha/dfs/jn/下没有mycluster目录增加后就格式化成功了

C/C++、Java、Python:主要编程语言的演进与未来趋势

导言 C/C、Java、Python作为主要的编程语言&#xff0c;在软件开发领域扮演着重要角色。本文将深入研究这三者的发展历程、遇到的问题、解决过程&#xff0c;以及未来的可用范围。同时&#xff0c;分析它们之间的联系与区别&#xff0c;探讨哪一门语言可能在未来占据主导地位&a…

Opencv入门6(读取彩色视频并转换为对数极坐标视频)

源码如下&#xff1a; #include <opencv2/opencv.hpp> #include <iostream> int main(int argc, char* argv[]) { cv::namedWindow("Example2_11", cv::WINDOW_AUTOSIZE); cv::namedWindow("Log_Polar", cv::WINDOW_AUTOSIZE); c…

在mt4上怎么查看CHFJPY品种的合约细则?

在MetaTrader 4 (MT4) 上查看CHFJPY品种的合约细则的方法如下&#xff1a; FXCM福汇官方个人注册登录流程 1.打开MT4软件并登录到您的交易账户。 2.在MT4界面的"市场观察"窗格中&#xff0c;找到并右键单击"CHFJPY"货币对。如果您无法找到"市场观察…

Android: Ubuntu下交叉环境编译常用调试工具demo for lspci命令(ARM设备)

lspci命令交叉环境编译(ARM设备) 交叉编译工具下载&#xff1a; https://releases.linaro.org/components/toolchain/binaries https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/aarch64-linux-gnu/ lspci命令交叉环境编译(ARM设备)&#xff1a; 1&a…

solidity 重入漏洞

目录 1. 重入漏洞的原理 2. 重入漏洞的场景 2.1 msg.sender.call 转账 2.2 修饰器中调用地址可控的函数 1. 重入漏洞的原理 重入漏洞产生的条件&#xff1a; 合约之间可以进行相互间的外部调用 恶意合约 B 调用了合约 A 中的 public funcA 函数&#xff0c;在函数 funcA…

从安全性角度,看“可信数字底座”有何价值

文章目录 每日一句正能量前言概念对比安全技术对比思考与建议 每日一句正能量 不管现在有多么艰辛&#xff0c;我们也要做个生活的舞者。 前言 万向区块链此前提出“可信数字底座”这一概念和技术&#xff0c;即将区块链与物联网、人工智能、隐私计算等数字化技术相融合&#…

3-10岁孩子语文能力培养里程碑

文章目录 基础能力3岁4岁5岁6-7岁&#xff08;1-2年级&#xff09;8-9岁&#xff08;3-4年级&#xff09;10岁&#xff08;5年级&#xff09; 阅读推荐&父母执行3岁4-5岁6-7岁&#xff08;1-2年级&#xff09;8-9岁&#xff08;3-4年级&#xff09;10岁&#xff08;5年级&a…

java --- 反射

目录 一、什么是反射&#xff1f; 二、获取 Class对象 的三种方式 三、反射获取构造方法&#xff08;Constructor&#xff09; 四、反射获取成员变量&#xff08;Field&#xff09; 五、反射获取成员方法&#xff08;Method&#xff09; 一、什么是反射&#xff1f; 反射允…