当前位置: 首页 > 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 介绍 导入 定义网络 模型训练 前馈神经网络 特点 常见类型 代码示例 反馈神经网络 特点 …...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...