lombok常用注解整理

idea需要先安装好lombok插件,不会的可以参考这里https://blog.csdn.net/qq_43842093/article/details/115426380

引入依赖

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.16</version>
</dependency>

常用注解

@Data :注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
@Setter :注解在属性上;为属性提供 setting 方法
@Setter :注解在属性上;为属性提供 getting 方法
@Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
@NoArgsConstructor :注解在类上;为类提供一个无参的构造方法
@AllArgsConstructor :注解在类上;为类提供一个全参的构造方法
@Cleanup : 可以关闭流
@Builder : 被注解的类加个构造者模式
@Synchronized : 加个同步锁
@SneakyThrows : 等同于try/catch 捕获异常
@NonNull : 如果给参数加个这个注解 参数为null会抛出空指针异常
@Value : 注解和@Data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会生成set方法。


注解详细介绍

@NonNull

这个注解可以用在成员方法或者构造方法的参数前面,会自动产生一个关于此参数的非空检查,如果参数为空,则抛出一个空指针异常,举个例子来看看:

//成员方法参数加上@NonNull注解
public String getName(@NonNull Person p){return p.getName();
}

实际效果相当于:

public String getName(@NonNull Person p){if(p==null){throw new NullPointerException("person");}return p.getName();
}

用在构造方法的参数上效果类似,就不再举例子了。

@Cleanup

这个注解用在变量前面,可以保证此变量代表的资源会被自动关闭,默认是调用资源的close()方法,如果该资源有其它关闭方法,可使用@Cleanup(“methodName”)来指定要调用的方法,就用输入输出流来举个例子吧:

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[1024];while (true) {int r = in.read(b);if (r == -1) break;out.write(b, 0, r);}}

实际效果相当于:

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();}}
}

是不是简化了很多。

@Getter/@Setter

这一对注解从名字上就很好理解,用在成员变量前面,相当于为成员变量生成对应的get和set方法,同时还可以为生成的方法指定访问修饰符,当然,默认为public,直接来看下面的简单的例子:

public class Programmer{@Getter@Setterprivate String name;@Setter(AccessLevel.PROTECTED)private int age;@Getter(AccessLevel.PUBLIC)private String language;
}

实际效果相当于:

public class Programmer{private String name;private int age;private String language;public void setName(String name){this.name = name;}public String getName(){return name;}protected void setAge(int age){this.age = age;}public String getLanguage(){return language;}
}

这两个注解还可以直接用在类上,可以为此类里的所有非静态成员变量生成对应的get和set方法。

@ToString/@EqualsAndHashCode

这两个注解也比较好理解,就是生成toString,equals和hashcode方法,同时后者还会生成一个canEqual方法,用于判断某个对象是否是当前类的实例,生成方法时只会使用类中的非静态非transient成员变量,这些都比较好理解,就不举例子了。
当然,这两个注解也可以添加限制条件,例如用@ToString(exclude={“param1”,“param2”})来排除param1和param2两个成员变量,或者用@ToString(of={“param1”,“param2”})来指定使用param1和param2两个成员变量,@EqualsAndHashCode注解也有同样的用法。

@NoArgsConstructor/@RequiredArgsConstructor /@AllArgsConstructor

这三个注解都是用在类上的,第一个和第三个都很好理解,就是为该类产生无参的构造方法和包含所有参数的构造方法,第二个注解则使用类中所有带有@NonNull注解的或者带有final修饰的成员变量生成对应的构造方法,当然,和前面几个注解一样,成员变量都是非静态的,另外,如果类中含有final修饰的成员变量,是无法使用@NoArgsConstructor注解的。
三个注解都可以指定生成的构造方法的访问权限,同时,第二个注解还可以用@RequiredArgsConstructor(staticName=”methodName”)的形式生成一个指定名称的静态方法,返回一个调用相应的构造方法产生的对象,下面来看一个生动鲜活的例子:

@RequiredArgsConstructor(staticName = "sunsfan")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor
public class Shape {private int x;@NonNullprivate double y;@NonNullprivate String name;
}

实际效果相当于:

public class Shape {private int x;private double y;private String name;public Shape(){}protected Shape(int x,double y,String name){this.x = x;this.y = y;this.name = name;}public Shape(double y,String name){this.y = y;this.name = name;}public static Shape sunsfan(double y,String name){return new Shape(y,name);}
}

@Data/@Value

呃!!
@Data注解综合了3,4,5和6里面的@RequiredArgsConstructor注解,其中@RequiredArgsConstructor使用了类中的带有@NonNull注解的或者final修饰的成员变量,它可以使用@Data(staticConstructor=”methodName”)来生成一个静态方法,返回一个调用相应的构造方法产生的对象。这个例子就也省略了吧…
@Value注解和@Data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会生成set方法。

@SneakyThrows

这个注解用在方法上,可以将方法中的代码用try-catch语句包裹起来,捕获异常并在catch中用Lombok.sneakyThrow(e)把异常抛出,可以使用@SneakyThrows(Exception.class)的形式指定抛出哪种异常,很简单的注解,直接看个例子:

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

实际效果相当于:

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

@Synchronized

这个注解用在类方法或者实例方法上,效果和synchronized关键字相同,区别在于锁对象不同,对于类方法和实例方法,synchronized关键字的锁对象分别是类的class对象和this对象,而@Synchronized得锁对象分别是私有静态final对象LOCK和私有final对象LOCK和私有final对象lock,当然,也可以自己指定锁对象,例子也很简单,往下看:

public class Synchronized {private final Object readLock = new Object();@Synchronizedpublic static void hello() {System.out.println("world");}@Synchronizedpublic int answerToLife() {return 42;}@Synchronized("readLock")public void foo() {System.out.println("bar");}
}

实际效果相当于:

public class Synchronized {private static final Object $LOCK = new Object[0];private final Object $lock = new Object[0];private final Object readLock = new Object();public static void hello() {synchronized($LOCK) {System.out.println("world");}}public int answerToLife() {synchronized($lock) {return 42;}}public void foo() {synchronized(readLock) {System.out.println("bar");}}}

@Log

这个注解用在类上,可以省去从日志工厂生成日志对象这一步,直接进行日志记录,具体注解根据日志工具的不同而不同,同时,可以在注解中使用topic来指定生成log对象时的类名。不同的日志注解总结如下(上面是注解,下面是实际作用):

@CommonsLog
private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);@JBossLog
private static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.class);@Log
private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());
@Log4j
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);@Log4j2
private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);@Slf4j
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);@XSlf4j
private static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);

关于lombok的注解先写到这里,当然,还有其他一些注解需要大家自己去摸索,同时lombok一直在扩展,将来肯定会加入更多的注解元素,拭目以待了。

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

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

相关文章

C/C++ const

看微软的文章&#xff1a; const (C) | Microsoft Learn

gpu浮点计算能力floaps_基准测试移动 GPU 中的浮点精度 - 第 2 部分

投稿人&#xff1a;&#xff0c;2013年6月11日这是有关GPU中浮点质量的一系列博文中的第二篇&#xff0c;我的灵感源自 发表于 的文章。在中&#xff0c;我宣称许多程序员其实并不真正了解浮点数字&#xff0c;也指出如果您准备将它用于比较棘手的东西&#xff0c;那么最好先准…

@DateTimeFormat注解

DateTimeFormat注解位于spring-context-5.0.10.RELEASE.jar包中 import org.springframework.format.annotation.DateTimeFormat; import java.util.Date;public class User {//姓名private String name;//出生日期DateTimeFormat(pattern "yyyy-MM-dd")private Da…

h5页面如何预览excel文件_移动端页面,如何解析预览 word/excel/PDF文件?

展开全部利用Office2007以上版本的一个PDF插件SaveAsPDFandXPS.exe可以导出PDF文件&#xff0c;然后再利用免费的swftools.exe工具生成swf格式的Flash文件&#xff0c;网页中加载flexpaper免费开源工具(32313133353236313431303231363533e59b9ee7ad9431333365633934有广告)实现…

Gson之toJson和fromJson方法

Gson是Google的一个开源项目&#xff0c;可以将Java对象转换成JSON&#xff0c;也可能将JSON转换成Java对象。 Gson里最重要的对象有2个Gson 和 GsonBuilder Gson有2个最基本的方法 toJson() – 转换java 对象到JSONfromJson() – 转换JSON到java对象 引入依赖&#xff1a;…

android 手机内存uri_android 的各种目录详解

App独立文件app独立文件就是那些不依赖于某特定app的文件这类文件当我们删除应用之后&#xff0c;还应该保留在手机上的&#xff0c;例如拍照的照片&#xff0c;不应该随着删除应用而被删除掉。这类文件应该是随着app删除而一起删除的&#xff0c;它们可以被存储在两个地方&…

python3 tkinter详解_python tkinter基本属性详解

1.外形尺寸尺寸单位&#xff1a;只用默认的像素或者其他字符类的值&#xff01;&#xff0c;不要用英寸毫米之类的内容。btn tkinter.Button(root,text 按钮)# 设置按钮尺寸&#xff0c;绝大多数默认单位是像素btn.pack(ipadx 100,ipady 20)2.坐标系btn tkinter.Button(ro…

Gson详解(二)

1.复杂Json转成对象 比如&#xff1a;jsonString:{“response”:{“content”:"\n\t",“msg”:“成功”,“code”:“0”,“data{“content”:”\n\t",“VIN”:“LDC12345678901234”},“cmd”:“ScanVINCode”}} Gson解析 Gson gson new Gson();roodBean gs…

linux mysql 备份脚本_linux 之mysql备份脚本

#date 2020.2.20#author zhang#描述 用户自己选择使用什么工具进行备份#$1 账户; $2 密码 $3 地址stty erase "^H"[ -f /etc/init.d/functions ] && . /etc/init.d/functions#备份文件夹路径backup_path"/usr/local/src/backup_mysql"[ -d $backup…

Java使用GSON对JSON进行解析——IDEA引入jar包方式

GSON GSON是Google公司开发的用于解析json的类库。可以很轻松地让程序员将java对象转换成JSON格式&#xff0c;或者将JSON格式的对象转换成Java对象。 使用方法很简单&#xff1a; 首先&#xff0c;需要将GSON类库的jar包引入到自己的IDE中&#xff0c;本教程使用IDEA为例子…

mysql查询姓王的信息代码_MySQL查询语句练习题

1.创建student和score表CREATE TABLE student (id INT(10) NOT NULL UNIQUE PRIMARY KEY ,name VARCHAR(20) NOT NULL ,sex VARCHAR(4) ,birth YEAR,department VARCHAR(20) ,address VARCHAR(50));创建score表。SQL代码如下&#xff1a;CREATE TABLE score (i…

IoT -- (四) 物联网系统架构介绍

物联网系统框架介绍 下面将谈到几个关键问题&#xff1a; 设备如何接入网络&#xff1f;设备间如何通信&#xff1f;物联网数据的用途?如何搭建起一个物联网系统框架呢&#xff1f;它的技术架构又是怎么样呢&#xff1f;物联网终端软件系统架构&#xff1f;物联网云平台系统…

mysql 删除not null_从MySQL的列中删除NOT NULL限制?

要从MySQL的列中删除NOT NULL限制&#xff0c;请使用ALTER命令。语法如下&#xff1a;ALTER TABLE yourTableName MODIFY COLUMN yourColumnName dataType;为了理解上述语法&#xff0c;让我们创建一个表。创建表的查询如下&#xff1a;mysql> create table NotNullDemo->…

IoT -- (五) IoT都有哪些通信协议

IOT都有哪些通信协议&#xff1f; 在物联网协议中&#xff0c;我们一般分为两大类&#xff0c;一类是传输协议&#xff0c;一类是通信协议。那么&#xff0c;物联网都有哪些通信协议呢? 在物联网协议中&#xff0c;我们一般分为两大类&#xff0c;一类是传输协议&#xff0c…

IoT -- (六) MQTT和CoAP对比分析

IoT物联网需要标准协议&#xff0c;针对小设备最有前景的两种是MQTT和CoAP。 MQTT和CoAP两者均&#xff1a; 开放标准&#xff1b; 比HTTP更适合于受限环境&#xff1b; 提供异步传输机制&#xff1b; 在IP上运行&#xff1b; 有很多种实现 MQTT在传输模式上更为灵活&am…

mysql5.7.19不好用_Mysql 5.7.19 免安装版遇到的坑(收藏)

1、从官网下载64位zip文件。2、把zip解压到一个位置&#xff0c;此位置为安装为安装位置3、如果有以前的mysql 如果是install的&#xff0c;去控制面板卸载&#xff0c;还需要删除以前mysql留下来的残留文件。如果是免安装的&#xff0c;用mysqld -remove命令删除 &#xff0c;…

IoT -- (八)MQTT优缺点

物联网并不仅仅是一种网络&#xff0c;而是一个新的生态环境&#xff0c;它描述的本质是越来越多的使用物品通过网络连接在一起并可使用单个或者多个的终端设备对它们进行各种控制和使用—当然&#xff0c;工业上的物联网通常连接到的石鼓传感器或者其他数据采集仪器以及行为单…

mysql 平滑扩容_数据库秒级平滑扩容架构方案

一、缘起(1)并发量大&#xff0c;流量大的互联网架构&#xff0c;一般来说&#xff0c;数据库上层都有一个服务层&#xff0c;服务层记录了“业务库名”与“数据库实例”的映射关系&#xff0c;通过数据库连接池向数据库路由sql语句以执行&#xff1a;如上图&#xff1a;服务层…

IoT -- (九) IoT通讯技术选型与模型设计

IoT时代的无线通讯技术 “世界上最遥远的距离就是没有网络”&#xff0c;网络通讯是IoT的基础&#xff0c;常见的无线网络通讯技术有&#xff1a;WiFi、NFC、ZigBee、Bluetooth、WWAN&#xff08;Wireless Wide Area Network&#xff0c;包括GPRS、3G、4G、5G等&#xff09;、…

SSM中PageHelper的使用步骤与com.github.pagehelper.PageHelper3系列与5系列的区别

SSM中PageHelper的使用步骤 一. 在pom.xml导入依赖 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.2</version></dependency>二. 交给IOC管理 在SqlSessionFactory…