lombok常用注解的功能和效果

官网:https://www.projectlombok.org
github源码地址:https://github.com/rzwitserloot/lombok

Lombok是一个Java库,它能通过注解的方式自动生成一些Java代码,从而减少代码冗余。以下是一些Lombok常用的注解:

  1. @Data

    • 功能:这是一个组合注解,它相当于同时使用了@Getter@Setter@ToString@EqualsAndHashCode@RequiredArgsConstructor(如果没有无参构造函数的话)。例如,对于一个简单的User类:
    import lombok.Data;
    @Data
    class User {private String name;private int age;
    }
    
    • 效果:Lombok会自动为nameage生成gettersetter方法。同时,它也会生成一个toString方法,用于方便地打印对象的属性值;一个equalshashCode方法,用于比较对象是否相等和生成哈希码;如果没有定义其他构造函数,还会生成一个包含所有final属性或者有@NonNull注解的属性作为参数的构造函数。
  2. @Value

    • 功能:主要用于创建不可变(immutable)的值对象。值对象是一种设计模式,这种对象在创建之后其状态不能被修改,所有的属性通常是final的。例如,对于一个简单的Point类:
    import lombok.Value;
    @Value
    public class Point {final int x;final int y;
    }
    
    • 效果:Lombok会自动为xy生成getter方法。同时,它也会生成一个toString方法,用于方便地打印对象的属性值;一个equalshashCode方法,用于比较对象是否相等和生成哈希码。通常和@Builder注解联合使用,Point point = Point.Builder().x(1).y(1).build();
  3. @Getter和@Setter

    • 功能
      • @Getter用于为类中的属性自动生成get方法。例如:
      import lombok.Getter;
      class Book {@Getterprivate String title;
      }
      
      • @Setter用于为类中的属性自动生成set方法。例如:
      import lombok.Setter;
      class Laptop {@Setterprivate double price;
      }
      
    • 效果:使用@Getter后,就可以通过book.getTitle()来获取title属性的值;使用@Setter后,可以通过laptop.setPrice(1000.0)来设置price属性的值。这两个注解可以单独使用,也可以一起使用,具体取决于是否需要读写属性。
  4. @ToString

    • 功能:用于自动生成toString方法。例如:
    import lombok.ToString;
    @ToString
    class Student {private String studentId;private String major;
    }
    
    • 效果:当需要打印Student对象时,会自动输出对象的属性值,类似于Student(studentId=xxx, major=xxx)的格式。可以通过@ToString(exclude = "studentId")这样的方式来排除某些属性,不将它们包含在toString输出的内容中。
  5. @EqualsAndHashCode

    • 功能:自动生成equalshashCode方法。例如:
    import lombok.EqualsAndHashCode;
    @EqualsAndHashCode
    class Employee {private String employeeId;private String department;
    }
    
    • 效果:当需要比较两个Employee对象是否相等或者将它们作为键放入HashSetHashMap等基于哈希的集合中时,这些自动生成的方法会根据对象的属性来进行比较和生成哈希码。同样,可以通过@EqualsAndHashCode(exclude = "department")来指定排除某些属性参与equalshashCode的计算。
  6. @NoArgsConstructor

    • 功能:生成一个无参构造函数。例如:
    import lombok.NoArgsConstructor;
    @NoArgsConstructor
    class Product {private String productName;private double price;
    }
    
    • 效果:这样就可以通过new Product()来创建一个Product对象,在一些场景下,比如反序列化或者通过反射创建对象时,无参构造函数是很有用的。
  7. @AllArgsConstructor

    • 功能:生成一个包含所有属性的构造函数。例如:
    import lombok.AllArgsConstructor;
    @AllArgsConstructor
    class Order {private String orderId;private String customerName;private double totalAmount;
    }
    
    • 效果:可以通过new Order("001", "John", 100.0)这样的方式使用包含所有属性的构造函数来创建Order对象。
  8. @RequiredArgsConstructor

    • 功能:生成一个包含final属性或者有@NonNull注解的属性作为参数的构造函数。例如:
    import lombok.RequiredArgsConstructor;
    import lombok.NonNull;
    @RequiredArgsConstructor
    class Vehicle {@NonNullprivate String vehicleId;private final String brand;
    }
    
    • 效果:Lombok会生成一个构造函数,其中vehicleIdbrand作为参数,因为vehicleId@NonNull注解修饰,brandfinal的。这样可以确保这些重要属性在对象创建时被初始化。
  9. @Builder

    • 功能:提供一种简洁的方式来创建对象,采用建造者(Builder)模式。例如:
    import lombok.Builder;
    @Builder
    class House {private String address;private int numberOfRooms;
    }
    
    • 效果:可以使用House house = House.builder().address("123 Main St").numberOfRooms(4).build();这样的方式来构建House对象,这种方式在创建对象时参数较多或者对象属性有一些默认值和可选值的情况下非常方便。
  10. @Log、@Slf4j等日志相关注解

    • 功能:这些注解用于自动生成日志对象,方便在类中进行日志记录。例如@Slf4j
    import lombok.extern.slf4j.Slf4j;
    @Slf4j
    class MyService {public void doSomething() {log.info("执行了doSomething方法");}
    }
    
    • 效果:Lombok会自动为MyService类生成一个名为logSLF4J日志对象,通过这个日志对象就可以方便地在类的方法中记录各种级别的日志信息,如debuginfowarnerror等。不同的日志相关注解(如@Log@Log4j等)对应不同的日志框架,但它们的作用都是类似的,用于简化日志对象的创建过程。
  11. @UtilityClass

    • 功能:构造函数私有化;提供静态方法和静态变量访问方式。
    import lombok.experimental.UtilityClass;
    @UtilityClass
    public class StringUtils {public static boolean isEmpty(String str) {return str == null || str.length() == 0;}
    }
    
    • 效果:Lombok会自动将StringUtils类的构造函数设为私有;使用@UtilityClass注解后,这些静态成员可以直接通过类名来访问,如StringUtils.isEmpty(“”),这符合工具类的使用习惯,即提供一组方便调用的实用功能,而不需要创建类的实例。
  12. @Cleanup

    • 功能:主要用于自动资源管理。在 Java 中,许多资源(如文件流、数据库连接、网络连接等)在使用完后需要手动关闭,以防止资源泄漏。@Cleanup注解可以简化这个过程。
      在处理文件读取时,传统的代码可能如下:
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    public class FileReadExample {public static void main(String[] args) {FileReader reader = null;try {File file = new File("example.txt");reader = new FileReader(file);char[] buffer = new char[(int) file.length()];reader.read(buffer);System.out.println(buffer);} catch (IOException e) {e.printStackTrace();} finally {if (reader!= null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}}}
    }
    
       - 使用`@Cleanup`注解后,代码可以简化为:```javaimport lombok.Cleanup;import java.io.File;import java.io.FileReader;import java.io.IOException;public class FileReadExampleWithCleanup {public static void main(String[] args) {try {File file = new File("example.txt");@Cleanup FileReader reader = new FileReader(file);char[] buffer = new char[(int) file.length()];reader.read(buffer);System.out.println(buffer);} catch (IOException e) {e.printStackTrace();}}}
    
    • 效果Lombok 在编译阶段会在使用@Cleanup注解的变量所在的代码块结束时,插入相应的资源释放代码(通常是调用资源的close()方法)。它会通过反射等方式来确定资源的关闭方法。对于大多数遵循 Java 标准的资源(如实现了java.io.Closeablejava.lang.AutoCloseable接口的资源),@Cleanup都能很好地工作。
  13. @Singular

    • 功能:主要用于和集合类型的属性一起使用,特别是在生成构建器(Builder)模式相关代码的时候。它提供了一种方便的方式来添加单个元素到集合属性中,而不是一次性设置整个集合。
    import lombok.Builder;
    import lombok.Singular;
    import java.util.List;
    @Builder
    public class Order {@Singular("product")private List<Product> products;
    }
    class Product {private String name;private double price;// 构造函数、getter和setter等方法省略
    }Order order = Order.builder().product(new Product("Book", 10.0)).product(new Product("Pen", 2.0)).build();
    
    • 效果:Lombok会确保生成的构建器代码在内部正确地处理集合的添加操作,避免了需要先构建整个商品列表然后再设置给Order对象的繁琐过程。
    • 注意事项@Singular主要用于集合类型的属性,如ListSetMap等。如果应用到非集合类型的属性上,Lombok 可能会产生编译错误或者不符合预期的行为;在使用@Singular注解时,指定的方法名称(如上述示例中的product)如果与类中的其他方法名称冲突,可能会导致编译问题或者运行时的异常行为,因此,在命名时需要注意避免冲突。
  14. @Delegate

    • 功能:用于实现委托(delegation)模式。委托模式是一种设计模式,它允许一个对象将一些职责委托给另一个对象来处理。
    class Person {private String name;private int age;public String getName() {return name;}public int getAge() {return age;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}
    }// 现在创建`Employee`类并使用`@Delegate`注解:
    import lombok.Delegate;
    class Employee {@Delegateprivate Person person;public Employee(Person person) {this.person = person;}
    }Person person = new Person();
    person.setName("John");
    person.setAge(30);
    Employee employee = new Employee(person);
    System.out.println(employee.getName()); 
    System.out.println(employee.getAge());
    employee.setName("Jane");
    System.out.println(person.getName()); 
    
    • 效果Employee类通过@Delegate注解委托Person类来处理getNamegetAgesetNamesetAge等方法。就好像Employee类自己拥有这些方法一样,实际上是将这些方法的调用委托给了内部的Person对象来处理。
  15. @SneakyThrows

    • 功能:将方法中可能抛出的已检查异常(Checked Exceptions)转换为未检查异常(Unchecked Exceptions)。
    import java.io.File;
    import java.io.FileInputStream;
    public class FileReadExample {public static void main(String[] args) {try {File file = new File("example.txt");FileInputStream fis = new FileInputStream(file);// 进一步的文件读取操作} catch (Exception e) {e.printStackTrace();}}
    }// 使用`@SneakyThrows`后的示例:
    import lombok.SneakyThrows;
    import java.io.File;
    import java.io.FileInputStream;
    public class FileReadExampleWithSneakyThrows {@SneakyThrowspublic static void main(String[] args) {File file = new File("example.txt");FileInputStream fis = new FileInputStream(file);// 进一步的文件读取操作}
    }
    
    • 效果:在使用@SneakyThrows注解的方法中,如果出现了已检查异常,Lombok 会在编译阶段将这个已检查异常包装成一个RuntimeException(未检查异常)。这样就不需要在方法签名中声明抛出异常,也不需要在方法内部显式地使用try - catch块来处理这个异常,从一定程度上简化了代码。不过,这也意味着异常的处理被推迟到了调用栈的上层,可能会导致异常信息在传播过程中丢失部分细节或者使得异常的处理不够及时和精确。

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

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

相关文章

Oracle PDB的开启和关闭

[生产环境关闭与开启Oracle PDB] 【运维场景】 在运维Oracle PDB的时候经常要开启和关闭PDB&#xff0c;对关闭和开启PDB的操作要非常熟悉。 【操作方法】 1. PDB的打开与关闭 关闭和开启DB的时候要看DB的警告日志&#xff0c;日志位置&#xff08;在Oracle用户下查看&…

【树莓派4B】MindSpore lite 部署demo

一个demo&#xff0c;mindspore lite 部署在树莓派4B ubuntu22.04中&#xff0c;为后续操作开个门&#xff01; 环境 开发环境&#xff1a;wsl-ubuntu22.04分发版部署环境&#xff1a;树莓派4B&#xff0c;操作系统为ubuntu22.04mindspore lite版本&#xff1a;mindspore-li…

LivePortrait 部署笔记

LivePortrait 开源地址&#xff1a; https://github.com/KwaiVGI/LivePortrait 模型下载&#xff1a; export HF_ENDPOINThttps://hf-mirror.com huggingface-cli download --resume-download KwaiVGI/LivePortrait --local-dir models--KwaiVGI--LivePortrait

yarn修改缓存位置

查看缓存位置 以下三个命令分别为&#xff1a;bin是yarn存储命令的二进制文件&#xff0c;global存储全局node_modules &#xff0c;cache存储用下下载缓存&#xff0c;查看本机目前的目录&#xff1a; 查看bin目录命令&#xff1a;yarn global bin 查看global目录命令&…

安卓 流量相关功能实现记录

1. 静态声明权限&#xff0c;在AndroidManifest.xml中申明 <uses-permission xmlns:tools"http://schemas.android.com/tools"android:name"android.permission.PACKAGE_USAGE_STATS"tools:ignore"ProtectedPermissions" /> 2.判断并动态…

第17天:信息收集-Web应用备案产权Whois反查域名枚举DNS记录证书特征相似查询

#知识点 1、信息收集-Web应用-机构产权&域名相关性 2、信息收集-Web应用-DNS&证书&枚举子域名 标签 名称 地址 企业信息 天眼查 天眼查-商业查询平台_企业信息查询_公司查询_工商查询_企业信用信息系统 企业信息 小蓝本 获客营销系统_ai智能拓客系统_企业获…

在循环群模运算中计算逆元

文章目录 一、算数模复合二、群 循环群1. 群 (Group)2. 环 (Ring)3. 循环群 (Cyclic Group)4. 多项式环 (Polynomial Ring)5. 有限域 (Finite Field)6. 椭圆曲线 (Elliptic Curve) 三、求逆元1. 扩展欧几里得算法1.1 算法概述1.2 步骤1.3 示例 2. 费马小定理 一、算数模复合 假…

Python使用Selenium库获取 网页节点元素、名称、内容的方法

我们要用到一些网页源码信息&#xff0c;例如获取一些节点的class内容&#xff0c; 除了使用Beautifulsoup来解析&#xff0c;还可以直接用Selenium库打印节点&#xff08;元素&#xff09;名称&#xff0c;用来获取元素的文本内容或者标签名。 例如获取下面的class的内容&am…

M3DM的autodl环境构建过程笔记

文章目录 在3D-ADS环境https://blog.csdn.net/tfxzgp/article/details/144259472基础上构建M3DM(失败的记录&#xff0c;不用看)更换镜像重来&#xff08;成功&#xff09;安装缺少的包修改models.py中的RGB和点云backbone的路径修改main.py路径参数运行 在3D-ADS环境https://b…

Android 使用Overlay现实主题切换

最近项目上&#xff0c;想做一个主题切换的功能&#xff0c;整理了一下发布出来&#xff0c;主要使用的是IOverlayManager&#xff0c;大体思路如下&#xff1a; 1、想切换的应用&#xff0c;各自做overlay apk&#xff08;简称皮肤包&#xff09; 2、将overlay apk push 到v…

【原生js案例】如何实现一个穿透字体颜色的导航

普通的导航大家都会做&#xff0c;像这种穿透字体的导航应该很少见吧。高亮不是通过单独设置一个active类来设置字体高亮颜色&#xff0c;鼠标滑过导航项&#xff0c;字体可以部分是黑色&#xff0c;不分是白色&#xff0c;这种效果的实现 感兴趣的可以关注下我的系列课程【we…

IDEA 2023.3.6 下载、安装、激活与使用

一、IDEA2023.3.6下载 国际官网&#xff1a;https://www.jetbrains.com/ 国内官网&#xff1a;https://www.jetbrains.com.cn/ 如果国际官网无法访问&#xff0c;就使用国内官网&#xff0c;我们以国内官网为例下载IDEA2023.3.6 首先进入首页如下图&#xf…

ip_done

文章目录 路由结论 IP分片 数据链路层重谈Mac地址MAC帧报头局域网的通信原理MSS&#xff0c;以及MAC帧对上层的影响ARP协议 1.公司是不是这样呢? 类似的要给运营商交钱&#xff0c;构建公司的子网&#xff0c;具有公司级别的入口路由器 2&#xff0e;为什么要这样呢?? IP地…

Unity 将数字1234转换为字母ABCD

需求如下&#xff1a; 数字1&#xff0c;转换后为&#xff1a;A 数字2&#xff0c;转换后为&#xff1a;B 数字3&#xff0c;转换后为&#xff1a;C 数字4&#xff0c;转换后为&#xff1a;D 数字123&#xff0c;转换后为&#xff1a;ABC C#实现代码如下&#xff1a; pri…

深度学习作业 - 作业十一 - LSTM

问题一 推导LSTM网络中参数的梯度&#xff0c;并的分析其避免梯度消失的效果 LSTM网络是为了解简单RNN中存在的长程依赖问题而提出的一种新型网络结构&#xff0c;其主要思想是通过引入门控机制来控制数据的流通&#xff0c;门控机制包括输入门、遗忘门与输出门&#xff0c;同…

医院与医疗设备供应商网络安全事故综述

医院与医疗设备供应商网络安全事故综述 在医疗行业中&#xff0c;医院和医疗设备供应商的网络安全问题同样不容忽视。以下是一些近年来发生的重大网络安全事故的总结&#xff1a; 1. 德国杜塞尔多夫大学医院勒索软件攻击&#xff08;2020年&#xff09; 事件描述&#xff1a…

修改vscode中emmet中jsx和tsx语法中className的扩展符号从单引号到双引号 - HTML代码补全 - 单引号双引号

效果图 实现步骤 文件 > 首选项 > 设置搜索“”在settings.json中修改&#xff0c;增加 "emmet.syntaxProfiles": {"html": {"attr_quotes": "single"},"jsx": {"attr_quotes": "double","…

从0到1实现vue3+vite++elementuiPlus+ts的后台管理系统(一)

前言&#xff1a;从这篇文章开始实现vue3vite的后台管理系统&#xff0c;记录下自己搭建后台系统图的过程。 这篇文章完成项目的初始化和基本配置&#xff0c;这一步可以直接跟着vue3官网进行。整个系列只有前端部分&#xff0c;不涉及后端。 vue3官网&#xff1a;https://cn.…

JavaEE初阶——多线程(线程安全-锁)

复习上节内容&#xff08;部分-掌握程度不够的&#xff09; 加锁&#xff0c;解决线程安全问题。 synchronized关键字&#xff0c;对锁对象进行加锁。 锁对象&#xff0c;可以是随便一个Object对象&#xff08;或者其子类的对象&#xff09;&#xff0c;需要关注的是&#xff…

如何在NGINX中实现基于IP的访问控制(IP黑白名单)?

大家好&#xff0c;我是锋哥。今天分享关于【如何在NGINX中实现基于IP的访问控制&#xff08;IP黑白名单&#xff09;&#xff1f;】面试题。希望对大家有帮助&#xff1b; 如何在NGINX中实现基于IP的访问控制&#xff08;IP黑白名单&#xff09;&#xff1f; 1000道 互联网大…