Lombok 常用注解

news2024/11/16 22:39:33

文章目录

    • 简介
    • MAVEN 依赖
    • 常用的注解
      • 1. @Data 注解 :
      • 2. @Setter 注解:
      • 3.@Getter 注解:
      • 4.@Log4j or @Slf4j 注解
      • 5.@NoArgsConstructor注解:
      • 6.@AllArgsConstructor注解:
      • 7.@RequiredArgsConstructor注解:
      • 8.@Builder注解:
      • 9.@Cleanup注解:
      • 10.@SneakyThrows 注解:
      • 11.@Accessors

简介

Lombok是一款Java开发插件,使得Java开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的Java模型对象(POJO)。
在开发环境中使用Lombok插件后,Java开发人员可以节省出重复构建,诸如hashCode和equals这样的方法以及各种业务对象模型的accessor和ToString等方法的大量时间。对于这些方法,它能够在编译源代码期间自动帮我们生成这些方法,并没有如反射那样降低程序的性能。

MAVEN 依赖

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

常用的注解

1. @Data 注解 :

一般用在类上,提供类所有属性的 get 和 set 方法,此外还提供了equals、canEqual、hashCode、toString等方法;
相当于注解集合。效果等同于 @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor 效果同和这5个注解的效果

需要注意的是,这里不包括@NoArgsConstructor和@AllArgsConstructor
所以, 一般使用@Data时,要配合这两个注解一起使用

2. @Setter 注解:

一般用在属性上,为属性提供 set 方法, 用在再类上则表示当前类中所有属性都生成set方法;

3.@Getter 注解:

用在属性上,为属性提供 get 方法, 用在再类上表示当前类中所有属性都生成get方法;

4.@Log4j or @Slf4j 注解

用在类上,为类提供一个 属性名为log 的 log4j日志对象;

5.@NoArgsConstructor注解:

用在类上,为类提供一个无参的构造方法;

6.@AllArgsConstructor注解:

用在类上,为类提供一个全参的构造方法;

  • 通过 @AllArgsConstructor(access = AccessLevel.PROTECTED) , 可以指定构造器的访问权限
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class Demo{
    private String name;
    private int age;
}

编译后生成:

public class Demo {
    private String name;
    private int age;

    protected Demo(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

  • @AllArgsConstructor(access = AccessLevel.PROTECTED, staticName = “test”)
@AllArgsConstructor(access = AccessLevel.PROTECTED, staticName = "test")
public class Demo{
    private final int finalVal = 10;
    private String name;
    private int age;
}

编译后 :

public class Demo {
    private String name;
    private int age;

    private Demo(String name, int age) {
        this.name = name;
        this.age = age;
    }

    protected static Demo test(String name, int age) {
        return new Demo(name, age);
    }
}

上面效果为:可以指定生成的构造器的访问权限。但是如果指定了一个静态方法,那么构造器会自动会被private,只通过静态方法对外提供访问,并且我们发现final的属性值,是不会放进构造函数里面的

7.@RequiredArgsConstructor注解:

用在类上,生成一个包含 “特定参数” 的构造器,特定参数指的是那些有加上 final 修饰词的变量们;
@RequiredArgsConstructor注解则会将类中所有带有@NonNull注解 / org.jetbrains.annotations.NotNull注解的或者带有final修饰的成员变量生成对应的构造方法
测试案例:

@RequiredArgsConstructor
public class Demo {

    @NonNull
    private final int finalVal;
    @NonNull
    private String name;
    @NonNull
    private int age;
}

编译后生成:

import lombok.NonNull;

public class Demo {
    @NonNull
    private final int finalVal;
    @NonNull
    private String name;
    @NonNull
    private int age;

    public Demo(@NonNull int finalVal, @NonNull String name, @NonNull int age) {
        if (name == null) {
            throw new NullPointerException("name is marked non-null but is null");
        } else {
            this.finalVal = finalVal;
            this.name = name;
            this.age = age;
        }
    }
}

8.@Builder注解:

用在类上,自动生成流式 set 值写法,从此之后再也不用写一堆 setter 了;

注意,虽然只要加上 @Builder 注解,我们就能够用流式写法快速设定对象的值,但是 setter 还是必须要写不能省略的,因为 Spring 或是其他框架有很多地方都会用到对象的 getter/setter 对他们取值/赋值所以通常是 @Data 和 @Builder 会一起用在同个类上,既方便我们流式写代码,也方便框架做事;

9.@Cleanup注解:

可以用在 IO 流上,用于关闭并释放资源;
例如下面例子,每次IO流操作后要在finally中关闭流,释放资源:

public class CleanupExample {
  public static void main(String[] args) throws IOException {
    InputStream in = new FileInputStream(args[0]);
    try {
      OutputStream out = new FileOutputStream(args[1]);
      try {
        byte[] b = new byte[10000];
        while (true) {
          int r = in.read(b);
          if (r == -1) break;
          out.write(b, 0, r);
        }
      } finally {
        if (out != null) {
          out.close();
        }
      }
    } finally {
      if (in != null) {
        in.close();
      }
    }
  }
}

类似以上的一个IO流操作的方法使用lombok 的 @Cleanup 注解后可以简化成这样:

public class CleanupExample {
    public static void main(String[] args) throws IOException {
        @Cleanup InputStream in = new FileInputStream(args[0]);
        @Cleanup OutputStream out = new FileOutputStream(args[1]);
        byte[] b = new byte[10000];
        while (true) {
            int r = in.read(b);
            if (r == -1) break;
            out.write(b, 0, r);
        }
    }
}

10.@SneakyThrows 注解:

利用了这一机制,将当前方法抛出的异常,包装成RuntimeException,骗过编译器,使得调用点可以不用显示处理异常信息,使用注解后不需要担心Exception的处理。例如:

import lombok.SneakyThrows;

public class SneakyThrowsExample implements Runnable {
  @SneakyThrows(UnsupportedEncodingException.class)
  public String utf8ToString(byte[] bytes) {
    return new String(bytes, "UTF-8");
  }
  
  @SneakyThrows
  public void run() {
    throw new Throwable();
  }
}

真正生成的代码

import lombok.Lombok;

public class SneakyThrowsExample implements Runnable {
  public String utf8ToString(byte[] bytes) {
    try {
      return new String(bytes, "UTF-8");
    } catch (UnsupportedEncodingException e) {
      throw Lombok.sneakyThrow(e);
    }
  }
  
  public void run() {
    try {
      throw new Throwable();
    } catch (Throwable t) {
      throw Lombok.sneakyThrow(t);
    }
  }
}

11.@Accessors

@Accessors 一个为getter和setter方法设计的更流畅的注解
这个注解要搭配@Getter与@Setter使用,用来修改默认的setter与getter方法的形式。
@Accessors属性详解

fluent 属性 : 链式的形式 这个特别好用,方法连缀越来越方便了
chain 属性 : 流式的形式(若无显示指定chain的值,也会把chain设置为true)
prefix 属性 : 生成指定前缀的属性的getter与setter方法,并且生成的getter与setter方法时会去除前缀
测试不使用@Accessors时
在这里插入图片描述
fluent属性

默认为false,当该值为 true 时,对应字段的 getter 方法前面就没有 get,setter 方法就不会有 set。

在这里插入图片描述
编译后生成:

public class Demo {
    private final int finalVal = 10;
    private String xxName;
    private int yyAge;

    public Demo() {
    }

    public int finalVal() {
        Objects.requireNonNull(this);
        return 10;
    }

    public String xxName() {
        return this.xxName;
    }

    public int yyAge() {
        return this.yyAge;
    }

    public Demo xxName(String xxName) {
        this.xxName = xxName;
        return this;
    }

    public Demo yyAge(int yyAge) {
        this.yyAge = yyAge;
        return this;
    }

    public String toString() {
        int var10000 = this.finalVal();
        return "Demo(finalVal=" + var10000 + ", xxName=" + this.xxName() + ", yyAge=" + this.yyAge() + ")";
    }
}

使用:

public class Main {

    public static void main(String[] args) {
        Demo demo = new Demo();
        // setter方法; 这里包含了chain=true的功能,可以链式设置值
        demo.xxName("lucky").yyAge(20);
        // getter方法
        System.out.println(demo.xxName() + "," + demo.yyAge());
        System.out.println("demo = " + demo);
    }
}

chain属性

不写默认为false,当该值为 true 时,对应字段的 setter 方法调用后,会返回当前对象, 进行链式设置值

在这里插入图片描述
编译后生成:

public class Demo {
    private final int finalVal = 10;
    private String xxName;
    private int yyAge;

    public Demo() {
    }

    public int getFinalVal() {
        Objects.requireNonNull(this);
        return 10;
    }

    public String getXxName() {
        return this.xxName;
    }

    public int getYyAge() {
        return this.yyAge;
    }

    public Demo setXxName(String xxName) {
        this.xxName = xxName;
        return this;
    }

    public Demo setYyAge(int yyAge) {
        this.yyAge = yyAge;
        return this;
    }

    public String toString() {
        int var10000 = this.getFinalVal();
        return "Demo(finalVal=" + var10000 + ", xxName=" + this.getXxName() + ", yyAge=" + this.getYyAge() + ")";
    }
}

使用

public class Main {

    public static void main(String[] args) {
        Demo demo = new Demo();
        // setter方法
        demo.setXxName("lucky").setYyAge(20);
        System.out.println("demo = " + demo);
    }
}

prefix属性
该属性是一个字符串数组,当该数组有值时,表示忽略字段中对应的前缀,生成对应的 getter 和 setter 方法。

如果,我们把它的前缀加到 @Accessors 的属性值中,则可以像没有前缀那样,去调用字段的 getter和 setter 方法。

在这里插入图片描述
这里只是把原有属性的前缀给去掉

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

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

相关文章

全国青少年软件编程(Scratch)等级考试一级真题——2019.12

青少年软件编程&#xff08;Scratch&#xff09;等级考试试卷&#xff08;一级&#xff09;分数&#xff1a;100 题数&#xff1a;37一、单选题(共25题&#xff0c;每题2分&#xff0c;共50分)1.下列关于舞台的描述&#xff0c;不正确的是&#xff1f;&#xff08; &#xff09…

DMHS搭建DMDSC 2节点集群同步到单库

DMHS搭建DMDSC 2节点集群同步到单库环境介绍1 安装DMOCI1.1 关闭数据库实例服务1.2 将DMOCI 复制到源端与目的端的数据库bin目录1.3 对数据库bin 执行目录文件更改用户属组和权限2 启动源数据库服务并配置数据库实例参数2.1 使用DMCSSM启动集群实例2.2 DMDSC源其中一个节点执行…

为何英格兰与苏格兰同属英国,却争端不断?

英国作为世界上的强国其组成部分是由大不列颠岛上的英格兰、威尔士和苏格兰以及爱尔兰岛东北部的北爱尔兰以及一系列附属岛屿。英国作为西欧的一个岛国&#xff0c;地理位置十分优越&#xff0c;位于欧洲大陆西北面的不列颠群岛。英国作为西欧的一颗不容忽视的“明星”&#xf…

【Unity风格化草地】概述风格化草地的实现方法

写在前面 最近本专业开始多很多事情了&#xff0c;要开始建模写论文了&#xff08;不然研究生毕不了业&#xff09;&#xff0c;TA方面的学习进度更慢了&#xff0c;&#xff0c;so sad。 废话不多说&#xff0c;这篇文章其实是个小总结&#xff0c;毕竟学习新东西就是先要当…

序列索引序列切片

六个标准数据类型中是序列的有&#xff1a;字符串&#xff08;String&#xff09;、列表&#xff08;List&#xff09;、元组&#xff08;Tuple&#xff09;。 通过索引和切片的方式可以访问序列中的元素。 一、序列索引 序列中的每一个元素都有一个属于自己的编号&#xff0c…

演唱会的火车票没了?Python实现12306查票以及zidong购票....

嗨害大家好&#xff01;我是小熊猫~ 不知道大家抢到演唱会的门票没有呢? 不管抢到没有&#xff0c;火车票也是很重要的哇 24小时抢票不间断的那种喔~ ~ ~ 不然可就要走路去了喔~ 准备工作 环境 Python 3.8Pycharm 插件 谷歌浏览器驱动 模块 需要安装的第三方模块&am…

1/4车、1/2车、整车悬架LQR仿真合集

目录 前言 1. 1/4悬架系统 1.1数学模型 1.2 LQR求解反馈阵阵(负反馈) 1.3仿真分析 2. 1/2悬架系统 2.1数学模型 2.2 LQR求解反馈阵阵(负反馈) 2.3仿真分析 3. 整车悬架系统 3.1数学模型 整车7自由度主动悬架数学模型 3.2 LQR求解反馈阵阵(负反馈) 3.3仿真分析 4…

MySQL(四)视图、存储过程、触发器

视图、存储过程、触发器视图检查选项视图的更新存储过程存储过程基本语法变量系统变量用户自定义变量局部变量if判断参数casewhile循环repeat循环loop循环cursor游标handler条件处理程序存储函数触发器视图 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据…

ERP原理与应用教程(作业2)

1. 简答题 ERP是一个高度集成的信息系统&#xff0c;从管理信息集成的角度来看&#xff0c;从MRP到MRPII到ERP&#xff0c;是企业管理信息继承的不断扩展和深化。 所有成为ERP的软件都把MRPII作为其生产和控制模块&#xff0c;以MRPII为基础的计划功能在整个供应链的业务处理…

Composer最小稳定性问题

Composer最小稳定性问题主要指的是&#xff0c;在使用Composer安装某个特定的依赖包时&#xff0c;可能会出现一些不稳定的情况&#xff0c;比如依赖包的版本号发生变化&#xff0c;或者依赖包的某些功能发生变化&#xff0c;这样就会导致应用程序出现问题。为了解决这个问题&a…

【数据结构】栈和队列 (栈 栈的概念结构 栈的实现 队列 队列的概念及结构 队列的实现 栈和队列面试题)

文章目录前言一、栈1.1 栈的概念结构1.2栈的实现二、队列2.1队列的概念及结构2.2队列的实现三、栈和队列面试题总结前言 一、栈 1.1 栈的概念结构 栈也是一种线性表&#xff0c;数据在逻辑上挨着存储。只允许在固定的一端进行插入和删除元素。进行插入和删除操作的一端叫栈顶…

记录 UE5 完全重新构建 UE C++项目

不知道搞了什么&#xff0c;C项目的实时代码编译罢工了&#xff0c;搞了半天都修不好&#xff0c;只能又重建了 UE5 版本为 v5.1.1 删除以下文件夹 /Binaries /Intermediate /SavedBinaries 文件夹是编译后的模块 Intermediate 文件夹里是中间层的C代码&#xff0c;完全由ue…

腾讯乐固加固+app签名+多渠道打包

一、腾讯乐固-基础版免费加固-上传未加固的app-下载加固包&#xff08;加固成功会清除原apk的签名信息和多渠道信息&#xff09;https://console.cloud.tencent.com/ms/reinforce/list/basic二、使用AndroidStudio自带工具apksigner对apk重新签名找到apksigner.bat文件 路径D:\…

CentOS7环境下Docker入门到dockerfile(一)CentOS7安装Docker、容器构建、文件复制与挂载

文章目录准备CentOS7虚拟机准备SecureCRT远程连接虚拟机Centos7环境下安装Docker安装Docker镜像Docker容器的基本操作Docker容器的文件复制与挂载可能遇到的问题准备CentOS7虚拟机 关于网络连接三种模式可以参看这篇博客 准备SecureCRT远程连接虚拟机 可以自行搜索相关安装博…

MQTT协议-发布消息和发布确认

MQTT协议-发布消息和发布确认 PUBLISH一发布消息 PUBLISH控制报文是指从客户端向服务端或者服务端向客户端传输一个应用消息。 发布消息报文由以下5个部分组成 固定报头由两个字节组成&#xff0c;第一个字节的高4位固定为0011&#xff0c;第2位和第1位表示Qos等级&#xff…

Redis单机版安装

文章目录前言Redis单机版安装下载1.安装依赖C语言依赖2.上传并解压3.编译并安装3.1编译3.2安装4.开启守护进程5.启动并测试5.1启动redis5.2关闭/重启redis5.3启动客户端工具5.4杀死进程的方式关闭redis前言 这里安装linux版本的redis,后续如有需要添加windowx版本 安装linux教…

电脑怎么重装系统?教你轻松掌握这些方法

重新安装计算机系统有两种原因&#xff1a;一种是计算机系统可以正常使用&#xff0c;但是电脑比较卡&#xff0c;为了提高它的运行速度&#xff0c;所以想要通过重新安装系统来解决这个问题;另一种原因是计算机系统文件丢失&#xff0c;系统出现蓝屏&#xff0c;或者黑屏的情况…

【Linux内核二】常用的网络丢包错包debug工具介绍

目录 ifconfig Ifconfig输出各字段简述 txqueuelen RX和TX的errors指哪些错误 dropped与overruns的区别 常用ifconfig配置命令 显示网卡信息 启动关闭指定网卡 配置和删除ip地址 修改MAC地址 启用和关闭ARP协议 设置最大传输单元 设置网卡的promiscuous模式 设置…

Git 学习(二)—— 工作区 — 本地仓库的操作命令

我们要上传文件到本地仓库&#xff0c;不是直接拷贝进去的&#xff0c;而是需要通过命令一步步上传。从工作区到本地仓库分为了三步&#xff0c;也可以说是三个区域&#xff1a; 目录 1、操作命令 (1) git init&#xff08;获取本地仓库&#xff09; (2) git add&#xff08;…

【Linux】 -- 进度条小程序

Linux第一个小程序&#xff0d;进度条 目录 行缓冲区概念 \r 和 \n 进度条代码和演示 行缓冲区概念 用两段代码来感受下行缓冲区的存在 #include<stdio.h> …