Java Lombok 使用记录

一、什么是 Lombok

Lombok 是一个 Java 库,它通过注解的方式,帮助开发者消除一些样板代码,从而简化 Java 代码的编写。Lombok 提供了许多注解,用于自动生成构造函数、getter、setter、equals、hashCode 等方法,以及简化对象的创建和初始化等操作。
总的来说使用 Lombok 可以通过注解的方式帮助开发者消除样板代码,减少重复性工作。

二、Lombok 使用

步骤一:在项目中引入 Lombok 依赖

Maven 项目在项目的 pom.xml 文件中添加以下依赖:

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

步骤二:安装 Lombok 插件

在你使用的集成开发环境(IDE)中安装 Lombok 插件。对于常见的 IDE 如 IntelliJ IDEA、Eclipse 等,都有对应的 Lombok 插件可供安装。安装完成后,重启 IDE 以使插件生效。

步骤三:在代码中使用 Lombok 注解

在需要使用 Lombok 功能的类或字段上添加相应的注解。在代码中使用 Lombok 提供的注解后,正常进行代码的编写、构建和运行即可。Lombok 插件会在编译时处理注解,并生成相应的代码。

以上是使用 Lombok 的基本步骤。通过引入 Lombok 依赖、安装插件并在代码中使用注解,你就可以充分利用 Lombok 提供的功能来简化代码编写,提高开发效率。

二、Lombok 的注解及其作用

@Getter@Setter

自动生成属性的 getter 和 setter 方法。

import lombok.Getter;
import lombok.Setter;public class Person {@Getter @Setter private String name;@Getter @Setter private int age;
}

@FieldNameConstants

用于为类中的字段生成常量名称。

import lombok.experimental.FieldNameConstants;@FieldNameConstants
public class Person {private String name;private int age;
}

在上面的示例中,@FieldNameConstants 注解被用于 Person 类。当使用这个注解后,Lombok 会自动生成一个内部类,其中包含了类中所有字段的常量名称,以便在代码中使用。生成的内部类名称默认为 $FieldNameConstants,可以通过@FieldNameConstants注解的innerTypeName 属性进行自定义。

public class Main {public static void main(String[] args) {String fieldName = Person.$FieldNameConstants.name; // 使用生成的常量System.out.println(fieldName); // 输出: "name"}
}

@ToString

用于自动生成类的 toString () 方法。

import lombok.ToString;@ToString
public class Person {private String name;private int age;
}

@EqualsAndHashCode

用于自动生成 equals ()hashCode () 方法。这两个方法是用于比较对象是否相等和生成对象的哈希码的重要方法。

import lombok.EqualsAndHashCode;@EqualsAndHashCode
public class Person {private String name;private int age;
}

@NoArgsConstructor

用于自动生成无参构造函数。

import lombok.NoArgsConstructor;@NoArgsConstructor
public class Person {private String name;private int age;
}

@AllArgsConstructor

用于自动生成包含所有非静态字段的参数的构造函数。

import lombok.AllArgsConstructor;@AllArgsConstructor
public class Person {private String name;private int age;
}

@RequiredArgsConstructor

用于自动生成一个包含所有 final 字段和带有 @NonNull 注解字段的构造函数

@RequiredArgsConstructor
public class Person {private final String name;private final int age;private String address;@NonNullprivate String phoneNumber;
}

对应生成的构造函数如下:

public Person (String name, int age, String phoneNumber) {this.name = name;this.age = age;this.phoneNumber = phoneNumber;
}

日志注解

  1. @Log: 生成一个名为 logjava.util.logging.Logger 日志记录器。

  2. @Log4j: 生成一个名为 logorg.apache.log4j.Logger 日志记录器。

  3. @Log4j2: 生成一个名为 logorg.apache.logging.log4j.Logger 日志记录器。

  4. @Slf4j: 生成一个名为 log 的 SLF4J 日志记录器。

  5. @XSlf4j: 生成一个名为 log 的参数化 SLF4J 日志记录器。

  6. @CommonsLog: 生成一个名为 log 的 Apache Commons Logging 日志记录器。

  7. @JBossLog: 生成一个名为 log 的 JBoss Logging 日志记录器。

  8. @Flogger: 生成一个名为 log 的 Flogger 日志记录器。

  9. @CustomLog: 生成一个自定义名称的日志记录器。

使用方法如下:

import lombok.extern.java.Log;@Log
public class MyClass {public void myMethod() {log.info("Logging information message");log.warning("Logging warning message");}
}

@Data

用于自动生成 Java 类的标准样板代码,包括 toStringequalshashCode 和字段的 getterssetters 方法。

import lombok.Data;@Data
public class Person {private String name;private int age;
}

@Builder

用于自动生成一个建造者模式(Builder Pattern)的构建器。使用 @Builder 注解后,Lombok 会生成一个名为 builder 的静态内部类,该构建器可以用于创建目标类的实例,并通过链式调用设置其属性。

import lombok.Builder;
import lombok.Data;@Data
@Builder
public class Person {private String name;private int age;
}
public class Main {public static void main(String[] args) {Person person = Person.builder().name("Alice").age(30).build(); // 使用生成的构建器创建实例System.out.println(person.toString());}
}

@SuperBuilder

它结合了 @Builder@Super 注解的功能。与 @Builder 注解类似,使用 @SuperBuilder 注解后,Lombok 会生成一个包含父类属性的构建器,并且可以通过链式调用设置其属性。与 @Super 注解结合使用时,可以确保生成的构建器包含父类的属性。

@Singular

用于自动生成针对集合类型的添加方法。当在一个字段上使用 @Singular 注解时,Lombok 会自动生成针对该字段的添加方法,以便向集合中逐个添加元素。

import lombok.Builder;
import lombok.Singular;
import java.util.List;@Builder
public class Pizza {private String name;@Singular private List<String> toppings;
}
public class Main {public static void main(String[] args) {Pizza pizza = Pizza.builder().name("Vegetarian").topping("Mushrooms").topping("Onions").topping("Peppers").build(); // 使用生成的构建器创建实例System.out.println(pizza.toString());}
}

@Delegate

用于自动生成委托方法。当在一个字段上使用 @Delegate 注解时,Lombok 会自动生成委托方法,将指定字段的方法委托给另一个对象。
简单来说就是可以让你的类使用其他类的方法,而不需要自己写代码。

import lombok.experimental.Delegate;public interface Greet {void greet();
}public class GreetImpl implements Greet {@Overridepublic void greet() {System.out.println("Hello, world!");}
}public class GreetDelegate {@Delegate private final Greet greet = new GreetImpl();
}
public class Main {public static void main(String[] args) {GreetDelegate delegate = new GreetDelegate();delegate.greet(); // 执行委托方法}
}

@Value

用于生成一个不可变的、线程安全的值对象。当在一个类上使用 @Value 注解时,Lombok 会自动为该类的所有成员变量生成对应的 private final 字段,并生成对应的构造函数、getter 方法以及 equalshashCodetoString 方法。需要注意的是,使用 @Value 注解的类中的字段将被自动标记为 final,并且无法通过普通的 setter 方法进行修改。

import lombok.Value;@Value
public class Person {String name;int age;
}
public class Main {public static void main(String[] args) {Person person = new Person("Alice", 30);System.out.println(person.getName()); // 访问生成的getter方法System.out.println(person.toString()); // 调用生成的toString方法}
}

@Accessors

用于配置生成的 getter 和 setter 方法的链式调用风格。通过 @Accessors 注解,可以自定义生成的方法的命名风格、前缀、是否使用链式调用等属性。

import lombok.Data;
import lombok.experimental.Accessors;@Data
@Accessors(prefix = "emp")
public class Employee {private String name;private int age;
}

在上面的示例中,@Accessors (prefix ="emp") 注解被用于 Employee 类。通过指定 prefix ="emp",Lombok 会生成以emp 作为前缀的 getter 和 setter 方法。

public class Main {public static void main(String[] args) {Employee employee = new Employee().empName("Alice").empAge(30);System.out.println(employee.empName()); // 访问生成的getter方法}
}

@Accessors 注解还提供了其他属性,如 fluent 用于控制是否启用链式调用、chain 用于控制链式调用的风格等,可以根据实际需求进行灵活配置。

@Wither

用于生成一个新的对象,该新对象在原对象的基础上修改了指定字段的数值。

import lombok.Value;
import lombok.experimental.Wither;@Value
public class Person {String name;int age;@Witherint age; // 通过@Wither生成的方法将修改age字段
}
public class Main {public static void main(String[] args) {Person person = new Person("Alice", 30);Person newPerson = person.withAge(31); // 生成的withAge方法用于创建新对象System.out.println(newPerson.toString()); // 输出新对象的信息}
}

通过使用 @Wither 注解,可以方便地创建一个新的对象,该对象在原对象的基础上修改了指定字段的值,同时保持其他字段的值不变。这在需要对不可变对象进行修改时非常有用。

需要注意的是,被 @Wither 注解的字段必须是 final 字段,或者使用 @Value 注解生成的不可变对象。

@With

@Wither 注解作用相似,用于生成一个新的对象,该新对象在原对象的基础上修改了指定字段的数值。与 @Wither 注解不同的是,@With注解可以应用于任何字段,而不需要字段是final 的。

@SneakyThrows

用于在方法中抑制检查型异常的检查。使用 @SneakyThrows 注解后,Lombok 会自动在方法中抛出检查型异常,而无需显式地在方法签名中声明或捕获异常。

import lombok.SneakyThrows;public class Example {@SneakyThrowspublic void performIOOperation() {// 在此方法中进行IO操作,无需显式处理异常throw new IOException("Simulated IO Exception");}
}

在上面的示例中,@SneakyThrows 注解被用于 performIOOperation 方法。即使 IOException 是一个检查型异常,方法中仍然可以直接抛出该异常,而无需显式地在方法签名中声明或捕获异常。

public class Main {public static void main(String[] args) {Example example = new Example();example.performIOOperation(); // 可以直接调用抛出检查型异常的方法}
}

通过使用 @SneakyThrows 注解,可以简化代码,避免在方法签名中声明或捕获检查型异常,使代码更加简洁。然而,需要注意的是,过度使用 @SneakyThrows 可能会导致代码可读性下降,因此建议谨慎使用,并在必要时添加适当的异常处理逻辑。

@val

用于在声明变量的同时进行类型推断。通过使用 @val 注解,可以让 Lombok 自动根据变量的初始化表达式推断出变量的类型,从而简化代码。

import lombok.val;public class Example {public void demonstrateVal() {val list = new ArrayList<String>(); // 使用@val进行类型推断list.add("Hello, ");list.add("val!");for (val item : list) {System.out.print(item);}}
}

需要注意的是,@val 注解只能用于局部变量的声明,不能用于字段或方法参数的声明。此外,由于 @val 是 Lombok 提供的特殊注解,所以在使用时需要确保项目中引入了 Lombok 相关的依赖。

@UtilityClass

用于简化实用工具类(Utility Class)的编写。通过使用 @UtilityClass 注解,您可以将类标记为实用工具类,并使其成为一个不可实例化、只包含静态方法的类。同时,Lombok 会自动生成私有构造函数和禁止继承的措施,以确保该类被正确使用。

import lombok.experimental.UtilityClass;@UtilityClass
public class StringUtils {public String reverseString(String input) {return new StringBuilder(input).reverse().toString();}public boolean isNullOrEmpty(String input) {return input == null || input.isEmpty();}
}
public class Main {public static void main(String[] args) {String original = "Hello, World!";String reversed = StringUtils.reverseString(original);System.out.println(reversed); // 输出: !dlroW ,olleH}
}

通过使用 @UtilityClass 注解,可以使实用工具类的编写更加简洁,并且确保其被正确使用。这样可以避免手动编写私有构造函数和禁止继承的措施,减少样板代码的编写。

@Synchronized

用于生成同步代码块,以确保多线程环境下方法或代码块的安全性。通过使用 @Synchronized 注解,Lombok 会自动在方法或代码块上生成一个同步块,以保证同一时间只有一个线程可以访问被注解的方法或代码块。

import lombok.Synchronized;public class Example {@Synchronizedpublic void synchronizedMethod() {// 在此方法上生成同步块,确保多线程安全// ...}
}

@Synchronized 注解可以应用于实例方法、静态方法以及自定义的锁对象。

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

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

相关文章

单元测试有什么好处呢?

测试工作就是模拟真实环境&#xff0c;在代码正式上线前进行验证的工作&#xff0c;即使没有任何工具和方法&#xff0c;这项工作也能够通过人工操作来手动完成。那么单元测试有什么好处呢&#xff1f; 提高软件质量&#xff1a;通过测试代码的各个小部分&#xff08;通常是函数…

LeetCode 441, 57, 79

目录 441. 排列硬币题目链接标签思路代码 57. 插入区间题目链接标签思路两个区间的情况对每个区间的处理最终的处理 代码 79. 单词搜索题目链接标签原理思路代码 优化思路代码 441. 排列硬币 题目链接 441. 排列硬币 标签 数学 二分查找 思路 由于本题所返回的 答案在区间…

解决PyCharm中的文件格式关联错误:终极指南

解决PyCharm中的文件格式关联错误&#xff1a;终极指南 PyCharm是一个功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为Python开发设计。然而&#xff0c;在使用过程中&#xff0c;用户可能会遇到文件格式关联错误的问题&#xff0c;这可能会导致IDE无法正…

engine.addImportPath()用于向 QML 引擎添加新的模块搜索路径

engine.addImportPath() 是 QQmlApplicationEngine 类中的一个方法&#xff0c;用于向 QML 引擎添加新的模块搜索路径。这在需要加载自定义模块或从非标准位置加载 QML 文件时非常有用。通过使用 addImportPath() 方法&#xff0c;可以让 QML 引擎在额外的路径中查找 QML 模块。…

JavaScript的学习(二)

今天继续学习JavaScript的第二天&#xff0c;还是打基础 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title…

3d复制的模型怎么渲染不出来?----模大狮模型网

在展览3D模型设计领域&#xff0c;技术的进步和创新使得模型的复杂性和精细度有了显著提升。然而&#xff0c;有时设计师们在尝试渲染复杂的3D复制模型时&#xff0c;却面临着无法正确呈现的问题。模大狮将探讨这一现象的可能原因&#xff0c;并提供相应的解决方案和建议&#…

知识图谱和 LLM:利用Neo4j驾驭大型语言模型(探索真实用例)

这是关于 Neo4j 的 NaLLM 项目的一篇博客文章。这个项目是为了探索、开发和展示这些 LLM 与 Neo4j 结合的实际用途。 2023 年,ChatGPT 等大型语言模型 (LLM) 因其理解和生成类似人类的文本的能力而风靡全球。它们能够适应不同的对话环境、回答各种主题的问题,甚至模拟创意写…

3d导入模型后墙体变成黑色?---模大狮模型网

在展览3D模型设计领域&#xff0c;技术和设计的融合通常是创意和实现之间的桥梁。然而&#xff0c;有时设计师们会遇到一些技术上的挑战&#xff0c;如导入3D模型后&#xff0c;墙体却突然变成了黑色。这种问题不仅影响了设计的视觉效果&#xff0c;也反映了技术应用中的一些复…

【UE5.3】笔记10-时间轴的使用

时间轴 右键--Add Timeline(在最下面) --> 双击进入时间轴的编辑界面&#xff1a; 左上角可以添加不同类型的轨道&#xff0c;可以自定义轨道的长度&#xff0c;单位秒&#xff0c;一次可以添加多个 可以通过右键添加关键帧&#xff0c;快捷键&#xff1a;shift鼠标左键按…

Perl 语言开发(十三):网络编程

目录 1. 概述 2. 网络编程基础 2.1 网络协议概述 2.2 Perl 网络编程基础模块 3. TCP 网络编程 3.1 创建 TCP 服务器 3.2 创建 TCP 客户端 4. UDP 网络编程 4.1 创建 UDP 服务器 4.2 创建 UDP 客户端 5. 高级网络编程 5.1 非阻塞 I/O 5.2 多线程网络编程 6. 简单的…

C++基础语法:链表和数据结构

前言 "打牢基础,万事不愁" .C的基础语法的学习 引入 链表是最基础的数据集合,对标数组.数组是固定长度,随机访问,链表是非固定长度,不能随机访问.数组查找快,插入慢;链表是插入快,查找慢. 前面推导过"数据结构算法数据集合".想建立一个数据集合,就要设计数…

前端时间格式传入后端负载里面没有东西

我是因为没有将时间值格式化&#xff0c;所有负载没有东西 <el-col :md"6"><el-form-item label"创建时间" prop"createTime"><el-date-picker v-model"queryParams.createTime" type"date" change"ha…

【MATLAB库函数系列】MATLAB库函数pwelch之功率谱估计的详解及实现

功率谱估计 由于实际信号通常是非定常的,我们只能假设其在10ms的时间段内是定常的,并在此基础上对短的定常信号求PSD或者能谱。 窗函数的作用就是将原始的信号分割成一段段可以计算PSD和能谱的短信号,并且保证了周期结构的连续性、避免了频谱泄漏。不同的窗函数具有不同的…

鸿蒙 画布来了 我不允许你不会

前言: 作者:徐庆 团队:坚果派 公众号:“大前端之旅” 润开鸿生态技术专家,华为HDE,CSDN博客专家,CSDN超级个体,CSDN特邀嘉宾,InfoQ签约作者,OpenHarmony布道师,电子发烧友专家博客,51CTO博客专家,擅长HarmonyOS/OpenHarmony应用开发、熟悉服务卡片开发。欢迎合作…

WPF+MvvmLight 项目入门完整教程(一)

WPF+MvvmLight入门完整教程一 创建项目MvvmLight框架安装完善整个项目的目录结构创建自定义的字体资源下载更新和使用字体资源创建项目 打开VS2022,点击创建新项目,选择**WPF应用(.NET Framework)** 创建一个名称为 CommonProject_DeskTop 的项目,如下图所示:MvvmLight框架…

OpenCV开发笔记(七十八):在ubuntu上搭建opencv+python开发环境以及匹配识别Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140435870 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

【Nuxt3】vue3+tailwindcss+vuetify引入自定义字体样式

一、目的 在项目中引入自定义的字体样式&#xff08;全局页面都可使用&#xff09; 二、步骤 1、下载好字体 字体的后缀可以是ttf、otf、woff、eot或者svg&#xff08;推荐前三种&#xff09; 以抖音字体为例下载好放在静态文件夹&#xff08;font&#xff09;下 案例字…

【论文阅读】《Visual Prompt Tuning》

Abstract. 目前调整预训练模型的工作方式包括更新所有骨干参数&#xff0c;即全面微调。本文介绍了视觉提示调整&#xff08;VPT&#xff09;&#xff0c;作为大规模视觉变换器模型全面微调的高效替代方案。VPT 从高效调整大型语言模型的最新进展中汲取灵感&#xff0c;只在输…

软件测试——面试八股文(入门篇)

今天给大家分享软件测试面试题入门篇&#xff0c;看看大家能答对几题 一、 请你说一说测试用例的边界 参考回答&#xff1a; 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充&#xff0c;这种情况下&#xff…

IAR全面支持芯驰科技E3系列车规MCU产品E3119/E3118

中国上海&#xff0c;2024年7月11日 — 全球领先的嵌入式系统开发软件解决方案供应商IAR与全场景智能车芯引领者芯驰科技宣布进一步扩大合作&#xff0c;最新版IAR Embedded Workbench for Arm已全面支持芯驰科技的E3119/E3118车规级MCU产品。IAR与芯驰科技有着悠久的合作历史&…