Lombok 使用详解,简化Java编程(上)

简介: Lombok 使用详解,简化Java编程(上)

前言


在 Java 应用程序中存在许多重复相似的、生成之后几乎不对其做更改的代码,但是我们还不得不花费很多精力编写它们来满足 Java 的编译需求


比如,在 Java 应用程序开发中,我们几乎要为所有 Bean 的成员变量添加 get() ,set() 等方法,这些相对固定但又不得不编写的代码浪费程序员很多精力,同时让类内容看着更杂乱,我们希望将有限的精力关注在更重要的地方。


微信图片_20220510114338.jpg

Lombok 已经诞生很久了,甚至在 Spring Boot Initalizr 中都已加入了 Lombok 选项,


微信图片_20220510114415.jpg


这里我们将 Lombok 做一下详细说明:


Lombok


官网的介绍:Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java. Never write another getter or equals method again. Early access to future java features such as val, and much more.


直白的说: Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注解实现这一目的,且看:


Bean 的对比


传统的 POJO 类是这样的


微信图片_20220510114535.png


通过Lombok改造后的 POJO 类是这样的


微信图片_20220510114649.png


一眼可以观察出来我们在编写 Employee 这个类的时候通过 @Data 注解就已经实现了所有成员变量的 get()set() 方法等,同时 Employee 类看起来更加清晰简洁。Lombok 的神奇之处不止这些,丰富的注解满足了我们开发的多数需求。


Lombok的安装


查看下图,@Data的实现,我们发现这个注解是应用在编译阶段的


微信图片_20220510114731.png


这和我们大多数使用的注解,如 Spring 的注解(在运行时,通过反射来实现业务逻辑)是有很大差别的,如Spring 的@RestController 注解


微信图片_20220510114755.png


一个更直接的体现就是,普通的包在引用之后一般的 IDE 都能够自动识别语法,但是 Lombok 的这些注解,一般的 IDE 都无法自动识别,因此如果要使用 Lombok 的话还需要配合安装相应的插件来支持 IDE 的编译,防止IDE 的自动检查报错,下面以 IntelliJ IDEA 举例安装插件。


在Repositories中搜索Lombok,安装后重启IDE即可


微信图片_20220510114818.png


在Maven或Gradle工程中添加依赖


微信图片_20220510114837.jpg


至此我们就可以应用 Lombok 提供的注解干些事情了。


Lombok注解详解


Lombok官网提供了许多注解,但是 “劲酒虽好,可不要贪杯哦”,接下来逐一讲解官网推荐使用的注解(有些注解和原有Java编写方式没太大差别的也没有在此处列举,如@ Synchronized等)


微信图片_20220510114858.png


@Getter和@Setter


该注解可应用在类或成员变量之上,和我们预想的一样,@Getter@Setter 就是为成员变量自动生成 get 和 set 方法,默认生成访问权限为 public 方法,当然我们也可以指定访问权限 protected 等,如下图:


微信图片_20220510114930.png


成员变量name指定生成set方法,并且访问权限为protected;boolean类型的成员变量 female 只生成get方法,并修改方法名称为 isFemale()。当把该注解应用在类上,默认为所有非静态成员变量生成 get 和 set 方法,也可以通过 AccessLevel.NONE 手动禁止生成get或set方法,如下图:


微信图片_20220510114947.png


@ToString


该注解需应用在类上,为我们生成 Object 的 toString 方法,而该注解里面的几个属性能更加丰富我们想要的内容, exclude 属性禁止在 toString 方法中使用某字段,而of属性可以指定需要使用的字段,如下图:


微信图片_20220510115009.png


查看编译后的Employee.class得到我们预期的结果,如下图


微信图片_20220510115030.png


@EqualsAndHashCode


该注解需应用在类上,使用该注解,lombok会为我们生成 equals(Object other) 和 hashcode() 方法,包括所有非静态属性和非transient的属性,同样该注解也可以通过 exclude 属性排除某些字段,of 属性指定某些字段,也可以通过 callSuper 属性在重写的方法中使用父类的字段,这样我们可以更灵活的定义bean的比对,如下图:


微信图片_20220510115059.png


查看编译后的Employee.class文件,如下图:


微信图片_20220510115120.png


@NonNull


该注解需应用在方法或构造器的参数上或属性上,用来判断参数的合法性,默认抛出 NullPointerException 异常


微信图片_20220510115140.png


查看NonNullExample.class文件,会为我们抛出空指针异常,如下图:


微信图片_20220510115200.png


当然我们可以通过指定异常类型抛出其他异常,lombok.nonNull.exceptionType = [NullPointerException | IllegalArgumentException] , 为实现此功能我们需要在项目的根目录新建lombok.config文件:


微信图片_20220510115219.png


重新编译NonNullExample类,已经为我们抛出非法参数异常:


微信图片_20220510115616.png


@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor


以上三个注解分别为我们生成无参构造器,指定参数构造器和包含所有参数的构造器,默认情况下,@RequiredArgsConstructor, @AllArgsConstructor 生成的构造器会对所有标记 @NonNull 的属性做非空校验。


无参构造器很好理解,我们主要看看后两种,先看 @RequiredArgsConstructor


微信图片_20220510115637.jpg


从上图中我们可以看出, @RequiredArgsConstructor 注解生成有参数构造器时只会包含有 final 和 @NonNull 标识的 field,同时我们可以指定 staticName 通过生成静态方法来构造对象


查看Employee.class文件


微信图片_20220510115741.jpg


当我们把 staticName 属性去掉我们来看遍以后的文件:


微信图片_20220510115804.jpg


相信你已经注意到细节


@AllArgsConstructor 就更简单了,请大家自行查看吧

相关文章
|
21天前
|
Java 程序员
Java编程中的异常处理:从基础到高级
在Java的世界中,异常处理是代码健壮性的守护神。本文将带你从异常的基本概念出发,逐步深入到高级用法,探索如何优雅地处理程序中的错误和异常情况。通过实际案例,我们将一起学习如何编写更可靠、更易于维护的Java代码。准备好了吗?让我们一起踏上这段旅程,解锁Java异常处理的秘密!
|
1天前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
5天前
|
算法 Java 调度
java并发编程中Monitor里的waitSet和EntryList都是做什么的
在Java并发编程中,Monitor内部包含两个重要队列:等待集(Wait Set)和入口列表(Entry List)。Wait Set用于线程的条件等待和协作,线程调用`wait()`后进入此集合,通过`notify()`或`notifyAll()`唤醒。Entry List则管理锁的竞争,未能获取锁的线程在此排队,等待锁释放后重新竞争。理解两者区别有助于设计高效的多线程程序。 - **Wait Set**:线程调用`wait()`后进入,等待条件满足被唤醒,需重新竞争锁。 - **Entry List**:多个线程竞争锁时,未获锁的线程在此排队,等待锁释放后获取锁继续执行。
32 12
|
1天前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
11 2
|
24天前
|
设计模式 Java 开发者
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####
|
24天前
|
缓存 Java 开发者
Java多线程编程的陷阱与最佳实践####
本文深入探讨了Java多线程编程中常见的陷阱,如竞态条件、死锁和内存一致性错误,并提供了实用的避免策略。通过分析典型错误案例,本文旨在帮助开发者更好地理解和掌握多线程环境下的编程技巧,从而提升并发程序的稳定性和性能。 ####
|
18天前
|
安全 算法 Java
Java多线程编程中的陷阱与最佳实践####
本文探讨了Java多线程编程中常见的陷阱,并介绍了如何通过最佳实践来避免这些问题。我们将从基础概念入手,逐步深入到具体的代码示例,帮助开发者更好地理解和应用多线程技术。无论是初学者还是有经验的开发者,都能从中获得有价值的见解和建议。 ####
|
18天前
|
Java 调度
Java中的多线程编程与并发控制
本文深入探讨了Java编程语言中多线程编程的基础知识和并发控制机制。文章首先介绍了多线程的基本概念,包括线程的定义、生命周期以及在Java中创建和管理线程的方法。接着,详细讲解了Java提供的同步机制,如synchronized关键字、wait()和notify()方法等,以及如何通过这些机制实现线程间的协调与通信。最后,本文还讨论了一些常见的并发问题,例如死锁、竞态条件等,并提供了相应的解决策略。
42 3
|
23天前
|
开发框架 安全 Java
Java 反射机制:动态编程的强大利器
Java反射机制允许程序在运行时检查类、接口、字段和方法的信息,并能操作对象。它提供了一种动态编程的方式,使得代码更加灵活,能够适应未知的或变化的需求,是开发框架和库的重要工具。
36 2
|
24天前
|
安全 Java 开发者
Java中的多线程编程:从基础到实践
本文深入探讨了Java多线程编程的核心概念和实践技巧,旨在帮助读者理解多线程的工作原理,掌握线程的创建、管理和同步机制。通过具体示例和最佳实践,本文展示了如何在Java应用中有效地利用多线程技术,提高程序性能和响应速度。
57 1