Lombok 的@StandardException注解解析
作者:明明如月学长 发布时间:2022-09-16 23:37:19
1. 引言
在 Java 应用程序中,异常类对于正确捕获和处理错误至关重要。我们常常在编写异常处理的重复代码上花费时间,而不是关注应用程序的其他方面。
在本教程中,我们将使用 Lombok 的 @StandardException 注解自动生成异常类型类的构造函数。此外,我们还将了解其优缺点。
2. 什么是 @StandardException?
@StandardException 是一个实验性的注解,添加到 Project Lombok 的 v__1.18.22 版本中。该注解适用于任何 Throwable 的子类,并自动生成四个构造函数:
一个无参数构造函数
一个仅带消息的构造函数,无异常原因
一个仅带异常原因的构造函数,无消息
一个带有消息和异常原因的标准构造函数
与大多数 Lombok 注解一样,@StandardException 非常简单,我们将在以下部分看到。
2.1. 添加 Lombok 依赖
我们需要使用 Project Lombok 的 v.1.18.22 或更高版本来使用该注解。因此,让我们将最新的 lombok::1.18.26 添加到我们的 pom.xml 文件中:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
<scope>provided</scope>
</dependency>
2.2. 使用类注解
要在我们的异常中使用 @StandardException,我们必须创建一个扩展 Throwable 类或其任何子类的目标类。因此,它适用于检查和未检查异常以及错误。
为了说明,让我们创建一个 CustomException 类:
@StandardException
public class CustomException extends Throwable {
}
由于 CustomException 扩展了 Throwable,代码正常编译。让我们看看编译后生成的代码:
public class CustomException extends Throwable {
public CustomException() {
this((String)null, (Throwable)null);
}
public CustomException(String message) {
this(message, (Throwable)null);
}
public CustomException(Throwable cause) {
this(cause != null ? cause.getMessage() : null, cause);
}
public CustomException(String message, Throwable cause) {
super(message);
if (cause != null) {
super.initCause(cause);
}
}
}
Lombok 注解的工作方式与实现自定义异常构造函数的通常 Java 方法不同。通常,JDK 通过调用指定签名的 super 构造函数版本来实现它们。例如,仅包含异常原因的构造函数在其实现中将调用 super(cause)。
另一方面,Lombok 的前三个构造函数依赖于生成的标准构造函数来构建异常对象。标准构造函数调用 super(message) 来构建初始对象。然后,如果不是 null,它使用 initCause() 方法初始化 CustomException 的原因。
在使用注解时,我们必须考虑这两种实现的不同细微差别。
接下来,我们将在下一部分中讨论与通常方法相比,@StandardException 的一些优点和缺点。
3. 优点
使用 @StandardException 的主要优点是我们避免了编写样板代码。例如,在纯 Java 中创建一个 NumberFormatException 的子类可能是这样的:
public class CustomNumberFormatException extends NumberFormatException{
public CustomNumberFormatException() {
super();
}
public CustomNumberFormatException(String s) {
super(s);
}
}
在上面的代码中,我们手动使用 NumberFormatException 的可用 super 构造函数创建了构造函数。
在实际应用程序中,该代码通常会在异常类之间重复。因此,我们最终多次复制粘贴相同的代码。当异常类数量较多时,这会更难维护。
相比之下,**通过使用 @StandardException,我们可以通过一行代码获得四个自动生成的构造函数。**因此,它可能会提高开发速度并改善代码可维护性。
关于 @StandardException 的另一个好点是,生成的构造函数仅使用 super(message) 构造函数,这在大多数 Java 异常中都存在。因此,我们避免了调用在父类中不存在的 super 构造函数。例如,NumberFormatException 没有定义标准和仅异常原因构造函数。因此,在其子类中调用 super(message, cause) 或 super(cause) 将失败。
最后,所有使用 @StandardException 的异常都具有 Lombok 实现的相同行为。由于 Lombok 自动生成代码,我们无法修改它。因此,我们不太可能向使用 @StandardException 注解的类中引入潜在的问题代码。
4. 缺点
使用代码生成器的一个明显缺点是增加了调试的复杂性。在编写的代码中调试和发现缺陷比在生成的代码中更容易。因此,如果某些内容运行不正确,使用 @StandardException 可能会使调试会话变得复杂。
另一个需要考虑的陷阱是对 Lombok 的依赖。将我们的代码与 @StandardException 耦合会增加返回纯Java 时的工作量。此外,如果 Lombok 方面出现问题,将影响所有使用该注解的异常。
5. 结论
在这篇简短的文章中,我们学习了如何使用添加到 Lombok 版本 v.1.18.22 的 @StandardException。我们还了解了与纯 Java 代码手动实现相比的一些优缺点。
关键是在我们的应用程序中平衡其优点和缺点,而不是滥用它。
与往常一样,源代码可以在 GitHub 上找到。
来源:https://mingmingruyue.blog.csdn.net/article/details/130567117


猜你喜欢
- 引言用过Spring Cloud的同学都知道在使用动态配置刷新的我们要配置一个 @RefreshScope,在类上才可以实现对象属性的的动态
- 今天新建一个springboot项目时,项目建好后,在IDEA下载依赖包时,下载了很久都没有下载完,后来仔细一看,是下载不了。解决方法:在项
- Android package属性、package name和Application ID三者的联系及区别package属性:在Androi
- 什么是Java类库在编写程序的时候,通常有很多功能是通用的,或者是很基础的,可以用这些功能来组成更发杂的功能代码。比如文件操作,不同程序对文
- 这篇文章主要介绍了Java 比较接口comparable与comparator区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作
- 详解HDFS多文件Join操作的实例最近在做HDFS文件处理之时,遇到了多文件Join操作,其中包括:All Join以及常用的Left J
- * 与过滤器在讲Spring boot之前,我们先了解一下过滤器和 * 。这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的
- 1.Spring Gateway概述1.1 什么是Spring Cloud GatewaySpring Cloud Gateway是Spri
- 数据库结构如下strategy中有外键member_id(关联member表)外键strategy_category(关联category表
- 利用ContentResolver访问者获取手机短信信息,在此记录一下,一遍以后查询。首先看一下结果,结果如下:activity_messa
- 本文实例讲述了Java获取时间年、月、日的方法。分享给大家供大家参考。具体实现方法如下:package com.date.demo; imp
- 本文实例为大家分享了Rxjava实现轮询定时器的具体代码,供大家参考,具体内容如下作用1、实现了延迟若干毫秒后,执行next操作,只执行一次
- 目录MVC结构简介SpringMVC简介SpringMVC执行流程常用注解1. @Controller2. @ResponseBody3.
- 系统的基本架构 我们假设一个系统System包含Service客户服务中心、Shop网上购物中心和Office网上办公中心三个独立的网站。
- 前言最近在Android Automotive 上遇到的一些问题,有好几个都跟Android 车载操作系统上应用的驾驶模式有关,国内这方面的
- SqlSessionFactory的openSession方法正如其名,Sqlsession对应着一次数据库会话。由于数据库回话不是永久的,
- 首先我们看看为什么添加Watch。ZooKeeper是用来协调(同步)分布式进程的服务,提供了一个简单高性能的协调内核,用户可以在此之上构建
- 偶然间发现了Android.inputmethodservice.Keyboard类,即android可以自定义键盘类,做了一个简单例子供大
- 本文实例讲述了C#导出数据到Excel文件的方法。分享给大家供大家参考。具体实现方法如下:/// <summary>/// 导出
- 本文为大家分享了maven环境变量配置的具体方法,供大家参考,具体内容如下一、maven环境配置1.解压apache-maven