Lombok新版超全面使用教程

news2024/11/19 18:28:48

一、Lombok介绍

Lombok是一个Java库,可以通过注解来简化Java类的编写,减少冗余的样板代码。它提供了一系列的注解,用于自动生成常见的代码,如getter和setter方法、构造函数、equals和hashCode方法、toString方法等。通过使用Lombok,开发者可以更加专注于业务逻辑的实现,减少了繁琐的重复劳动。

二、Lombok常用注解

2.1  @Getter/@Setter 

@Getter和@Setter注解是Lombok库的一部分,它们会自动为你的类生成getter和setter方法。这些方法通常用于访问类的私有字段。可以添加在类上或者方法上。

这是如何使用这些注解的一些基本示例:

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class User {

    private String name;
    private int age;
    private String password;

}

AccessLevel是Lombok中的一个属性,用于指定生成的getter、setter方法的访问级别。

AccessLevel有三个可选值:

  1. AccessLevel.PUBLIC:生成public访问级别的getter方法。
  2. AccessLevel.PROTECTED:生成protected访问级别的getter方法。
  3. AccessLevel.NONE:不生成getter方法,属性保持私有,无法从外部访问。

 上面的基本示例代码如果希望外部不能操作password属性,即可使用AccessLevel属性

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class User {

    private String name;
    private int age;

    @Getter(AccessLevel.NONE)
    @Setter(AccessLevel.NONE)
    private String password;
}

 

2.2  @ToString

@ToString是Lombok库中的一个注解,用于自动生成toString方法。通过在类上添加@ToString注解,Lombok将根据类的字段生成一个toString方法,返回一个包含类名和字段值的字符串。

下面是一个使用@ToString注解的示例:

import lombok.ToString;

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

 在这个示例中,Lombok会自动生成一个toString方法,如下所示:

public String toString() {
    return "Person(name=" + this.getName() + ", age=" + this.getAge() + ")";
}

2.3  @EqualsAndHashCode

@EqualsAndHashCode是Lombok库中的一个注解,它自动生成equals()hashCode()方法。当你在类上添加@EqualsAndHashCode注解后,Lombok会根据类的字段生成相应的equals()hashCode()方法。

equals()方法用于比较两个对象是否相等,而hashCode()方法返回对象的哈希码值。在Java中,这两个方法是Object类的一部分,用于支持对象比较和散列操作。

以下是一个使用@EqualsAndHashCode注解的示例:

import lombok.EqualsAndHashCode;

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

Lombok将根据这个类的字段生成以下equals()hashCode()方法:

@Override
public boolean equals(Object obj) {
    if (this == obj) return true;
    if (obj == null || getClass() != obj.getClass()) return false;
    Person person = (Person) obj;
    return age == person.age && Objects.equals(name, person.name);
}

@Override
public int hashCode() {
    return Objects.hash(name, age);
}

2.4  @NonNull

@NonNull 是 Lombok 库中的一个注解,用于指示一个参数、返回值或字段不能为 null。当你在类的方法或字段上使用 @NonNull 注解时,Lombok 会自动生成校验代码,确保该方法或字段在使用前不为 null。

以下是一个使用 @NonNull 注解的示例:

import lombok.NonNull;

public class Example {
    @NonNull
    private String name;

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

    public String getName() {
        return name;
    }
}

在上面的示例中,name 字段和 setName() 方法都使用了 @NonNull 注解。这表示 name 字段不能为 null,如果尝试将 null 值赋给 name,Lombok 将自动生成校验代码抛出异常。同样,setName() 方法也不会允许传入 null 参数。

使用 @NonNull 注解可以帮助开发人员避免空指针异常,并在编译时检查非空约束。它是一种方便的工具,可以提高代码的可读性和健壮性。

2.5  @NoArgsConstructor

@NoArgsConstructor 是 Lombok 库中的一个注解,用于自动生成一个无参构造函数。当你在类上添加 @NoArgsConstructor 注解时,Lombok 会根据类的字段生成一个无参构造函数。

2.6  @RequiredArgsConstructor(了解)

 @RequiredArgsConstructor 是 Lombok 库中的一个注解,它会自动生成一个包含所有需要特殊处理(例如,需要使用 final 修饰符或@NonNull注解)的参数的构造函数。当你在类上添加 @RequiredArgsConstructor 注解时,Lombok 会根据类的字段生成一个构造函数,该构造函数的参数是使用final关键字修饰的参数或使用@NonNull注解的参数。

2.7  @AllArgsConstructor

@AllArgsConstructor 是 Lombok 库中的一个注解,用于自动生成一个包含所有字段的构造函数。当你在类上添加 @AllArgsConstructor 注解时,Lombok 会为该类生成一个包含所有字段的构造函数。这个构造函数会使用参数的名字作为参数的名称。

2.8  @Data(最常用)

@Data 是 Lombok 库中的一个注解,它为 Java 类自动生成 getter、setter 方法、toString() 方法、equals()、hashCode() 和 和特殊处理(使用 final 修饰符或@NonNull注解)的参数的构造函数。通过在类上添加 @Data 注解,Lombok 会根据类的字段生成这些方法。

具体来说,@Data 注解包含以下四个子注解:

  1. @Getter 和 @Setter:为类的字段生成 getter 和 setter 方法。
  2. @ToString:为类生成 toString() 方法,该方法返回类的实例的字符串表示形式。
  3. @EqualsAndHashCode:为类生成 equals() 和 hashCode() 方法。
  4. @RequiredArgsConstructor:为类生成一个包含所有需要特殊处理(使用 final 修饰符或@NonNull注解)的参数的构造函数。

请注意,如果你使用 @Data 注解,Lombok 会自动生成这些方法,而无需手动编写这些代码。

@Data 
public class User {
    private String name;
    private int age;
}

2.9  @Builder(炫技必备,链式编程)

@Builder 是 Lombok 库中的一个注解,用于自动生成一个 builder 类。通过在类上添加 @Builder 注解,Lombok 会为该类生成一个 builder 类,该 builder 类具有用于设置每个字段的 setter 方法以及一个用于创建最终对象的 build() 方法。

使用 @Builder 注解可以简化代码,并使代码更易于阅读和维护。它使得代码更加清晰明了,避免了手动编写 builder 类的繁琐过程。

周式概括:在实体类上使用@Builder注解后,在实体类中会生成一个builder()方法,该方法用于return一个对应的builder类(构造器)。在构建器中,实体类中的每个参数,都会对应创建类似于 setter 的方法,方法名与该参数名相同,并且返回值是构建器本身(便于链式调用)。还会提供一个会build 方法,return实体类对象。

@Builder
public class User {
    private String username;
    private String password;
}

编译后

public class User {
    private String username;
    private String password;
    
    User(String username, String password) {
        this.username = username;
        this.password = password;
    }
    
    public static User.UserBuilder builder() {
        return new User.UserBuilder();
    }
	
    public static class UserBuilder {
        private String username;
        private String password;
        
        UserBuilder() {}
		
        public User.UserBuilder username(String username) {
            this.username = username;
            return this;
        }
        
        public User.UserBuilder password(String password) {
            this.password = password;
            return this;
        }
        
        public User build() {
            return new User(this.username, this.password);
        }
        
		public String toString() {
            return "User.UserBuilder(username=" + this.username + ", password=" + this.password + ")";
        }
    }
}

1.在实体类中:会创建一个 builder 方法,它的目的是用来创建构建器

2.创建一个名为 ThisClassBuilder 的内部静态类,并具有和实体类相同的属性(称为构建器)

3.在构建器中:对于目标类中的所有的属性和未初始化的 final 字段,都会在构建器中创建对应属性

4.在构建器中:创建一个无参的 default 构造函数

5.在构建器中:实体类中的每个参数,都会对应创建类似于 setter 的方法,方法名与该参数名相同。 并且返回值是构建器本身(便于链式调用)

6.在构建器中:会创建一个 build 方法,调用 build 方法,就会根据设置的值进行创建实体对象

7.在构建器中:会生成一个 toString 方法

USer user = User.builder().username("admin").password("admin).build();

2.10  @Slf4j

@Slf4j是Lombok库中的一个注解,它可以为Java类自动添加一个名为log的日志记录器。@Slf4j注解使用了SLF4J(Simple Logging Facade for Java)日志框架。通过使用@Slf4j注解,您无需手动创建private static final Logger log = LoggerFactory.getLogger(YourClassName.class)这样的日志记录器,而是直接使用log变量进行日志记录。

使用@Slf4j注解的示例代码如下所示:

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class MyClass {
    public void myMethod() {
        log.debug("Debug log message");
        log.info("Info log message");
        log.error("Error log message");
    }
}

在上述代码中,通过使用@Slf4j注解,即可在MyClass中自动添加一个名为log的日志记录器。然后,您可以在方法中使用log变量来记录日志。在示例中,使用了不同的日志级别(debug、info和error)记录不同级别的日志信息。

三、Lombok使用 

3.1 引入依赖:

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

3.2 安装插件(第一次使用时)

IDEA中File->Settings->Plugins,搜索安装Lombok插件。

3.3 在Java类中使用Lombok注解

在Java类中使用Lombok注解:您可以在需要简化的Java类中使用Lombok的注解来自动生成代码。以下是一些常用的Lombok注解:

通过在类上添加这些注解,Lombok会自动生成相应的代码。

  • @Getter / @Setter: 自动生成字段的getter和setter方法。
  • @ToString: 自动生成toString()方法,用于输出对象的字符串表示。
  • @EqualsAndHashCode: 自动生成equals()hashCode()方法。
  • @NoArgsConstructor / @RequiredArgsConstructor / @AllArgsConstructor: 自动生成无参数构造函数、指定参数的构造函数或包含所有参数的构造函数。
  • @Data: 是一个组合注解,相当于同时使用了@Getter@Setter@ToString@EqualsAndHashCode、@RequiredArgsConstructor注解。
  • @Slf4j: 自动生成日志记录器。

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

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

相关文章

交流充电桩与直流充电桩的区别

1、背景 直流充电桩的学名是非车载充电机&#xff0c;是相对于交流充电桩而言的。交流充电桩是采用传导方式为具备车载充电机的电动汽车提供交流电能的专用装置。 2、交流充电桩和直流充电桩 1.1、交流充电桩 交流充电桩包括单相和三相交流充电桩。 图一是交流充电桩原理框…

5.3每日一题(不确定正负号的级数敛散性:和一个正项级数比较判定)

比较判别法和比较判别法的极限形式是对正项级数而言的&#xff0c;若一个级数和p级数比较&#xff0c;结果>0&#xff0c;则同敛散&#xff1b;若结果<0&#xff0c;则结果乘以-1 结果又同敛散了&#xff1b;所以只要比值不等于0&#xff0c;则同敛散&#xff1b; 所以当…

合共软件创新亮相:第102届上海电子展成就技术新篇章

2023年&#xff0c;第102届中国&#xff08;上海&#xff09;电子展活动在全球瞩目中圆满落幕。作为下半年华东地区最具影响力的电子展会&#xff0c;此次盛会吸引了来自全球的600家领先企业&#xff0c;共同探讨电子元器件行业的最新发展成果和趋势。 本届展会围绕核心先导元器…

SQL Injection (Blind)`

SQL Injection (Blind) SQL Injection (Blind) SQL盲注&#xff0c;是一种特殊类型的SQL注入攻击&#xff0c;它的特点是无法直接从页面上看到注入语句的执行结果。在这种情况下&#xff0c;需要利用一些方法进行判断或者尝试&#xff0c;这个过程称之为盲注。 盲注的主要形式有…

【Leetcode】【实现循环队列】【数据结构】

代码实现&#xff1a; typedef struct {int front;int back;int k;int* a;} MyCircularQueue;bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->frontobj->back; }bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->back1)%(obj->…

M2BLS

U are randomly generated&#xff0c;g is an activation function 辅助信息 作者未提供代码

网页设计作业-音乐网站首页

效果图 网盘链接 链接&#xff1a;https://pan.baidu.com/s/1CO4jAOY0zk1AWTx_pC3UmA?pwdfuck 提取码&#xff1a;fuck

【仿写C++中的move函数和forward函数】

仿写实现move函数 一、值的类型 1.左值 描述&#xff1a;能够取地址的值成为左值 int a 10; const int b 15; int *pa &a; const int *pb &b;2.纯右值 描述&#xff1a;赤裸裸的字面值 eg(false , 3 , 12.23等) int a 13; int *p &a; //取a的地址 int …

【电路笔记】-分流器

分流器 文章目录 分流器1、概述2、通用/网络配置3、无功分流器3.1 电阻电容分流器3.2 电阻-电感分流器 4、总结 我们在之前关于分压器的文中已经看到&#xff0c;分压过程是通过在串联配置中关联相同的组件来实现的。 在本文中&#xff0c;我们将重点关注电流分频器执行的电流分…

【Qt之QFileInfo】使用

描述 QFileInfo类提供了与系统无关的文件信息。 QFileInfo提供有关文件的名称和位置&#xff08;路径&#xff09;在文件系统中的信息&#xff0c;以及它的访问权限、是否为目录或符号链接等。还可以获取文件的大小和最后修改/读取时间。QFileInfo还可以用于获取关于Qt资源的信…

强化学习,快速入门与基于python实现一个简单例子(可直接运行)

文章目录 一、什么是“强化学习”二、强化学习包括的组成部分二、Q-Learning算法三、迷宫-强化学习-Q-Learning算法的实现全部代码&#xff08;复制可用&#xff09;可用状态空间检查是否超出边界epsilon 的含义更新方程 总结 一、什么是“强化学习” 本文要记录的大概内容&am…

python自动化测试——自动化基本技术原理

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

【教学类-06-11】20231125(55格版)X-Y之间“除法÷题”(以1-9乘法口诀表倒推)(随机抽取和正序抽取)

图片展示 &#xff08;随机打乱排序&#xff09; 正序&#xff08;每张都一样&#xff09; 背景需求&#xff1a; 前面三篇写到了随机加法、随机减法、随机乘法&#xff0c;既然做了三套&#xff0c;怎么能不试试最后一款“除法”呢 模仿乘法版本&#xff0c;制作打乱版和正…

【手写实现一个简单版的Dubbo,深刻理解RPC框架的底层实现原理】

手写实现一个简单版的Dubbo&#xff0c;深刻理解RPC框架的底层实现原理 RPC框架简介了解Dubbo的实现原理服务暴露服务引入服务调用 手写实现一个简单版的Dubbo服务暴露ServiceBeanProxyFactory#getInvokerProtocol#exportRegistryProtocol#export 服务引入RegistryProto#referD…

3、点亮一个LED

新建工程 project—>New uVision Project LED介绍 中文名&#xff1a;发光二极管 外文名&#xff1a;Light Emitting Diode 简称&#xff1a;LED 用途&#xff1a;照明、广告灯、指引灯 电路图分析 进制的转换 生成下载文件&#xff1a; 代码 //导包 #inclu…

Keil5个性化设置及常用快捷键

Keil5个性化设置及常用快捷键 1.概述 这篇文章是Keil工具介绍的第三篇文章&#xff0c;主要介绍下Keil5优化配置&#xff0c;以及工作中常用的快捷键提高开发效率。 第一篇&#xff1a;《安装嵌入式单片机开发环境Keil5MDK以及整合C51开发环境》https://blog.csdn.net/m0_380…

leetcode刷题详解——买卖股票的最佳时机含手续费

1. 题目链接&#xff1a;714. 买卖股票的最佳时机含手续费 2. 题目描述&#xff1a; 给定一个整数数组 prices&#xff0c;其中 prices[i]表示第 i 天的股票价格 &#xff1b;整数 fee 代表了交易股票的手续费用。 你可以无限次地完成交易&#xff0c;但是你每笔交易都需要付手…

PostgreSQL 分区表插入数据及报错:子表明明存在却报不存在以及column “xxx“ does not exist 解决方法

PostgreSQL 分区表插入数据及报错&#xff1a;子表明明存在却报不存在以及column “xxx“ does not exist 解决方法 问题1. 分区表需要先创建子表在插入&#xff0c;创建子表立马插入后可能会报错子表不存在&#xff1b;解决&#xff1a; 创建子表及索引后&#xff0c;sleep10毫…

动态规划经典例题leetcode思路代码详解

目录 动态规划基础篇例题 leetcode70题.爬楼梯 leetcode746题.使用最小花费爬楼梯 leetcode198题.打家劫舍 leetcode62题.不同路径 leetcode64题.最小路径和 leetcode63题.63不同路径II 动态规划基础篇例题 这一篇的例题解答是严格按照我上一篇写的动态规划三部曲做的&…

中职组网络安全-linux渗透测试-Server2203(环境+解析)

任务环境说明&#xff1a; 服务器场景&#xff1a;Server2203&#xff08;关闭链接&#xff09; 用户名&#xff1a;hacker 密码&#xff1a;123456 1.使用渗透机对服务器信息收集&#xff0c;并将服务器中SSH服务端口号作为flag提交&#xff1b; FLAG:2232 2. 使用渗透机对…