当前位置: 首页 > news >正文

【Lombok使用详解】

目录

      • 前言:注解速查
      • 1.Lombok概念
      • 2.安装Lombok
      • 3. 使用Lombok
        • 3.1 😊@Data
        • 3.2 @Getter@Setter
        • 3.3 @NonNull
        • 3.4 @Synchronized
        • 3.5 @ToString:自动生成toString()方法
        • 3.6 @Cleanup
        • 3.7 @EqualsAndHashCode

前言:注解速查

  • @NonNull : 用在成员方法或者构造方法的参数前面,会自动产生一个关于此参数的非空检查,如果参数为空,则抛出一个空指针异常

  • @CleanUp : 自动资源管理:不用再在finally中添加资源的close方法

  • @Setter/@Getter : 自动生成set和get方法

  • @ToString : 自动生成toString方法

  • @EqualsAndHashcode : 从对象的字段中生成hashCode() 方法和equals()方法的实现

  • @NoArgsConstructor/@RequiredArgsConstructor/@AllArgsConstructor
    自动生成构造方法

  • @Data : 自动生成set/get方法,toString方法,equals方法,hashCode方法,不带参数的构造方法

  • @Value : 用于注解final类

  • @Builder : 产生复杂的构建器api类

  • @SneakyThrows : 异常处理(谨慎使用)

  • @Synchronized : 同步方法安全的转化

  • @Getter(lazy=true) :

  • @Log: 支持各种logger对象,使用时用对应的注解,如:@Log4j


1.Lombok概念

Lombok是一个通过注解以达到减少代码的Java库,(或者说是一个插件)如通过注解的方式减少get,set方法,构造方法等。

2.安装Lombok

如何安装使用Lombok?

  • 方法一
    通过向lib文件夹中添加lombok.jar包即可,

  • 方法二 如果使用的是Maven,则可在项目的pom.xml文件中添加以下依赖:

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

Intellij Idea 识别Lombok方法:

File->settings->Plugins->Browse repositories->Lombok

3. 使用Lombok

Lombok提供注解方式来提高代码的简洁性,常用注解有:

  • 😊@Data
  • @Setter @Getter
  • @NonNull
  • @Synchronized
  • @ToString
  • @EqualsAndHashCode
  • @Cleanup
  • @SneakyThrows
3.1 😊@Data

最常用的就是@Data注解

自动生成set/get方法,toString方法,equals方法,hashCode方法,不带参数的构造方法,toString方法。

@Data=@Setter + @Getter + @ToString + @EqualsAndHashCode+@RequiredArgsConstructor

该注解相当于同时加上以下五个注解:

@Setter @Getter,@ToString,@EqualsAndHashCode@RequiredArgsConstructor,作用于类中 使用:

@Data
public class Student {private String name;private String address;private String sex;private String email;private  int   age;
}

效果:

我们就可以通过类对象调用相应的get和set方法

public static void main(String[] args){Student student=new Student();student.setName("张三丰");student.getName();}
3.2 @Getter@Setter

作用于属性上,自动生成get,set方法.

public class Student {@Getter@Setterprivate String name;
}

等价源码:

public String getName() {return name;
}public void setName(String name) {this.name = name;
}
3.3 @NonNull

@NonNull : 用在成员方法或者构造方法的参数前面,会自动产生一个关于此参数的非空检查,如果参数为空,则抛出一个空指针异常java.lang.NullPointerException

使用方法:

public class Person {private String name;@Setter@Getter@NonNullprivate List<Person> member;
}

源码:

@NonNull
private List<Person> members;public Family(@NonNull final List<Person> members) {if (members == null) throw new java.lang.NullPointerException("members");this.members = members;
}@NonNull
public List<Person> getMembers() {return members;
}public void setMembers(@NonNull final List<Person> members) {if (members == null) throw new java.lang.NullPointerException("members");this.members = members;
}
3.4 @Synchronized

该注解自动添加到同步机制,生成的代码并不是直接锁方法,而是锁代码块, 作用范围是方法上
使用方法:

private DateFormat t = new SimpleDateFormat("yyyy-MM-dd");@Synchronized
public String synchronizedFormat(Date date) {return t.format(date);
}

生成等价源码:

Object lock = new Object();
private DateFormat t = new SimpleDateFormat("yyyy-MM-dd");public String synchronizedFormat(Date date) {synchronized (lock) {return t.format(date);}
}
3.5 @ToString:自动生成toString()方法

方法我们都熟悉,但需要注意的是:@ToString有多个属性可以进一步设置:

  • callSuper 是否输出父类的toString方法,默认为false

  • includeFieldNames 是否包含字段名称,默认为true

  • exclude 排除生成tostring的字段

@ToString(callSuper = true,exclude ={"name"})
public class Person {private String name;private String address;
}

等价源码:

public String toString() {return "Person{" +"address='" + address + '\'' +'}';
}
3.6 @Cleanup

@CleanUp : 自动资源管理:不用再在finally中添加资源的close方法

注释可用于确保已分配的资源被释放,如IO的连接关闭。
使用方法:

public void testCleanUp() {try {@Cleanup ByteArrayOutputStream baos = new ByteArrayOutputStream();baos.write(new byte[] {'Y','e','s'});System.out.println(baos.toString());} catch (IOException e) {e.printStackTrace();}
}

等价源码:

public void testCleanUp() {try {ByteArrayOutputStream baos = new ByteArrayOutputStream();try {baos.write(new byte[]{'Y', 'e', 's'});System.out.println(baos.toString());} finally {baos.close();}} catch (IOException e) {e.printStackTrace();}
}
3.7 @EqualsAndHashCode

@Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集

当使用@Data注解时,则有了@EqualsAndHashCode注解,那么就会在此类中存在equals(Object other) 和 hashCode()方法,且不会使用父类的属性,这就导致了可能会出现问题,如下举例:

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

解决方法:

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

  2. 使用@Getter ,@Setter @Tostring 代替 @Data 并自定义(重写) equals() 和 hashcode() 方法,比如有些类只需要判断主键 id 是否相等就够了。


参考博文:https://blog.csdn.net/u010695794/article/details/70441432

相关文章:

【Lombok使用详解】

目录 前言&#xff1a;注解速查1.Lombok概念2.安装Lombok3. 使用Lombok3.1 &#x1f60a;Data3.2 GetterSetter3.3 NonNull3.4 Synchronized3.5 ToString&#xff1a;自动生成toString()方法3.6 Cleanup3.7 EqualsAndHashCode 前言&#xff1a;注解速查 NonNull : 用在成员方法…...

Tars框架 Tars-Go 学习

Tars 框架安装 网上安装教程比较多&#xff0c;官方可以参数这个 TARS官方文档 (tarsyun.com) 本文主要介绍部署应用。 安装完成后Tars 界面 增加应用amc 部署申请 amc.GoTestServer.GoTestObj 名称不知道的可以参考自己创建的app config 点击刷新可以看到自己部署的应用 服…...

基于JAVA+SpringBoot+VUE+微信小程序的前后端分离咖啡小程序

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着社会的快速发展和…...

2015年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版

文章目录 2015 级考研管理类联考数学真题一、问题求解&#xff08;本大题共 15 小题&#xff0c;每小题 3 分&#xff0c;共 45 分&#xff09;下列每题给出 5 个选项中&#xff0c;只有一个是符合要求的&#xff0c;请在答题卡上将所选择的字母涂黑。真题&#xff08;2015-01&…...

优秀软件设计特征与原则

1.摘要 一款软件产品好不好用, 除了拥有丰富的功能和人性化的界面设计之外, 还有其深厚的底层基础, 而设计模式和算法是构建这个底层基础的基石。好的设计模式能够让产品开发快速迭代且稳定可靠, 迅速抢占市场先机&#xff1b;而好的算法能够让产品具有核心价值, 例如字节跳动…...

设备管理系统-设备管理软件

一、为什么要使用设备管理系统 1.企业扩张快&#xff0c;设备配置多&#xff0c;管理混乱。 2.设备数量多&#xff0c;存放地点多&#xff0c;查找麻烦。 3.同类设备单独管理, 困难。 4.设备较多时相关信息统计容易出错&#xff0c;错误后修改困难。 二、凡尔码设备管理软件的…...

物联网AI MicroPython学习之语法 I2S音频总线接口

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; I2S 介绍 模块功能: I2S音频总线驱动模块 接口说明 I2S - 构建I2S对象 函数原型&#xff1a;I2S(id, sck, ws, sd, mode, bits, format, rate, ibuf)参数说明&#xff1a; 参数类型必选参数&#xff1f…...

Day31| Leetcode 455. 分发饼干 Leetcode 376. 摆动序列 Leetcode 53. 最大子数组和

进入贪心了&#xff0c;我觉得本专题是最烧脑的专题 Leetcode 455. 分发饼干 题目链接 455 分发饼干 让大的饼干去满足需求量大的孩子即是本题的思路&#xff1a; class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {…...

基于C#实现赫夫曼树

赫夫曼树又称最优二叉树&#xff0c;也就是带权路径最短的树&#xff0c;对于赫夫曼树&#xff0c;我想大家对它是非常的熟悉&#xff0c;也知道它的应用场景&#xff0c;但是有没有自己亲手写过&#xff0c;这个我就不清楚了&#xff0c;不管以前写没写&#xff0c;这一篇我们…...

Android 13.0 app进程保活白名单功能实现

1.前言 在13.0的系统rom产品开发中,在某些重要的app即使进入后台,产品需求要求也不想被系统杀掉进程,需要app长时间保活,就是app进程保活白名单功能的实现, 所以需要在系统杀进程的时候不杀掉白名单的进程,接下来就看怎么样来实现这些功能 2.app进程保活白名单功能实…...

查找学习笔记

1、静态查找表 以下查找的索引均从1开始 &#xff08;1&#xff09;顺序查找&#xff08;带哨兵&#xff09; #include<iostream> #include<vector>using namespace std;int search(vector<int> arr, int key) {arr[0] key;int i;for (i arr.size() - 1…...

Qt QIODevice介绍

作者:令狐掌门 技术交流QQ群:675120140 csdn博客:https://mingshiqiang.blog.csdn.net/ 文章目录 主要功能用法示例读取数据写入数据使用数据流基于套接字的读写注意事项QIODevice 是 Qt 中所有输入/输出设备的抽象基类。它为派生类提供了一组标准的接口用于读写数据。这些派…...

python -opencv 中值滤波 ,均值滤波,高斯滤波实战

python -opencv 中值滤波 &#xff0c;均值滤波&#xff0c;高斯滤波实战 cv2.blur-均值滤波 cv2.medianBlur-中值滤波 cv2.GaussianBlur-高斯滤波 直接看代码吧&#xff0c;代码很简单&#xff1a; import copy import math import matplotlib.pyplot as plt import matp…...

【教学类-06-07】20231124 (55格版)X-X之间的加法、减法、加减混合题

背景需求 在大四班里&#xff0c;预测试55格“5以内、10以内、20以内的加法题、减法题、加减混合题”的“实用性”。 由于只打印一份20以内加法减法混合题。 “这套20以内的加减法最难”&#xff0c;我询问谁会做&#xff08;摸底幼儿的水平&#xff09; 有两位男孩举手想挑…...

postgresql经常出现连接一会后服务器拒绝连接

本地连接远程Linux上PG数据库经常自动断开连接 原因&#xff1a;Linux设置的tcp的keepalive超时时间太长&#xff0c;如果网络状况不佳&#xff0c;可能会导致连接断掉。 [rootlocalhost ~]# sysctl -a | grep net.ipv4.tcp_keepalive sysctl: reading key "net.ipv6.con…...

迈巴赫S480升级主动式氛围灯 浪漫婉转的气氛

主动式氛围灯有263个可多色渐变的LED光源&#xff0c;营造出全情沉浸的动态光影氛围。结合智能驾驶辅助系统&#xff0c;可在转向或检测到危险时&#xff0c;予以红色环境光提示&#xff0c;令光影艺术彰显智能魅力。配件有6个氛围灯&#xff0c;1个电脑模块。 1、气候&#xf…...

Leetcode103 二叉树的锯齿形层序遍历

二叉树的锯齿形层序遍历 题解1 层序遍历双向队列 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 提示&#xff1a…...

可观测性建设实践之 - 日志分析的权衡取舍

指标、日志、链路是服务可观测性的三大支柱&#xff0c;在服务稳定性保障中&#xff0c;通常指标侧重于发现故障和问题&#xff0c;日志和链路分析侧重于定位和分析问题&#xff0c;其中日志实际上是串联这三大维度的一个良好桥梁。 但日志分析往往面临成本和效果之间的权衡问…...

Ceres使用

之前用过Ceres&#xff0c;但是只是跑例程&#xff0c;现在来着重学习一下使用流程。 1. 解决的问题 主要解决非线性优化问题。Ceres是一个较为通用的库。 参考链接 2. 如何使用 这个是求解的函数&#xff0c;主要关注这三个参数 CERES_EXPORT void Solve(const Solver::O…...

深度学习第1天:深度学习入门-Keras与典型神经网络结构

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 文章目录 神经网络 介绍 结构 基本要素 Keras 介绍 导入 定义网络 模型训练 前馈神经网络 特点 常见类型 代码示例 反馈神经网络 特点 …...

批量给文件改名的方法有哪些?这5个实用技巧新手也能秒会

在日常办公和学习中&#xff0c;我们常常需要处理大量文件&#xff0c;杂乱的文件名不仅影响工作效率&#xff0c;还可能导致文件查找困难。无论是学生整理作业、职场人士归档资料&#xff0c;还是摄影爱好者管理照片&#xff0c;批量给文件改名都是必备技能。本文将详细介绍5种…...

三菱FX3U PLC编程避坑指南:加减乘除指令用错,小心数据寄存器不够用!

三菱FX3U PLC运算指令实战避坑&#xff1a;寄存器分配的艺术与陷阱 第一次在FX3U上编写配方计算程序时&#xff0c;我遇到了一个诡异的现象——明明乘法运算逻辑正确&#xff0c;最终结果却总是莫名其妙地覆盖了其他变量。经过三天排查才发现&#xff0c;原来是一个32位乘法结果…...

【PySide6】构建实时视频监控界面:从摄像头捕获到QLabel动态显示

1. 环境准备与基础概念 在开始构建实时视频监控界面之前&#xff0c;我们需要先准备好开发环境。PySide6是Qt框架的Python绑定库&#xff0c;它提供了丰富的GUI组件和工具&#xff0c;非常适合用来开发桌面应用程序。OpenCV则是一个强大的计算机视觉库&#xff0c;能够轻松处理…...

数据安全优先:企业级智能体私有化部署完整方案与最佳实践

摘要&#xff1a; 站在2026年4月的技术节点回望&#xff0c;企业级智能体&#xff08;AI Agent&#xff09;已完成从“对话助手”到“数字员工”的代际跨越。然而&#xff0c;在规模化落地过程中&#xff0c;数据主权与复杂系统的非侵入式集成成为架构师面临的首要挑战。本文从…...

CSC之外的选择:深度拆解北航‘卓越远航’基金的申请逻辑与隐藏条款

CSC之外的选择&#xff1a;深度拆解北航‘卓越远航’基金的申请逻辑与隐藏条款 当国家留学基金委&#xff08;CSC&#xff09;的竞争日益激烈&#xff0c;许多博士生开始将目光转向校级资助项目。北京航空航天大学的"卓越远航"基金作为CSC的重要补充&#xff0c;为无…...

别再模拟IIC了!用STM32F103C8T6的硬件IIC驱动AT24C64,CubeMX配置+避坑指南

从模拟IIC到硬件IIC&#xff1a;STM32F103C8T6驱动AT24C64的实战进阶指南 在嵌入式开发中&#xff0c;IIC总线因其简洁的两线制设计&#xff08;SCL时钟线和SDA数据线&#xff09;而广受欢迎。然而&#xff0c;许多开发者习惯使用GPIO模拟IIC时序&#xff0c;这种方式虽然灵活&…...

第47篇:AI提示工程高级技巧——思维链、少样本学习与角色扮演(操作教程)

文章目录前言环境准备分步操作技巧一&#xff1a;思维链 (Chain-of-Thought, CoT)技巧二&#xff1a;少样本学习 (Few-Shot Learning)技巧三&#xff1a;角色扮演 (Role Playing)完整代码示例&#xff1a;综合应用踩坑提示总结前言 在AI应用开发中&#xff0c;我们常常遇到这样…...

【板块轮动 | 算力行情】为什么AI算力正在成为A股下一个「新能源」——以及这次谁在提前下车

一、为什么算力行情在「复刻」新能源&#xff0c;但没有那么简单 2024年9月以后&#xff0c;如果你身边有炒A股的朋友&#xff0c;大概率听过两种声音。 一种说"算力就是下一个新能源&#xff0c;早信早上车"&#xff1b;另一种说"这次不一样&#xff0c;别被…...

DLSS Swapper深度解析:如何通过注册表管理实现游戏性能调优

DLSS Swapper深度解析&#xff1a;如何通过注册表管理实现游戏性能调优 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 当你在游戏中启用DLSS技术时&#xff0c;是否曾好奇过它到底在后台做了些什么&#xff1f;为什么…...

Python os.path模块:isfile()与isdir()的隐藏逻辑与实战避坑指南

1. 为什么你的路径判断总出错&#xff1f;揭秘isfile()与isdir()的隐藏逻辑 刚接触Python文件操作时&#xff0c;我也被这两个函数坑过好几次。记得有次写自动化脚本&#xff0c;明明逻辑没问题&#xff0c;但就是判断不准路径类型。后来才发现&#xff0c;问题出在对os.path.i…...