Lombok 学习

mac2024-05-15  24

一、Lombok 简介

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

二、Lombok 安装

2.1 构建工具

Gradle

在 build.gradle 文件中添加 lombok 依赖:

dependencies { compileOnly 'org.projectlombok:lombok:1.18.10' annotationProcessor 'org.projectlombok:lombok:1.18.10' }

Maven

在 Maven 项目的 pom.xml 文件中添加 lombok 依赖:

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

Ant

假设在 lib 目录中已经存在 lombok.jar,然后设置 javac 任务:

<javac srcdir="src" destdir="build" source="1.8"> <classpath location="lib/lombok.jar" /> </javac>

2.2 IDE

由于 Lombok 仅在编译阶段生成代码,所以使用 Lombok 注解的源代码,在 idea中会被高亮显示错误,针对这个问题可以通过安装 IDE 对应的插件来解决。可以在idea 中安装IntelliJ Lombok plugin (https://plugins.jetbrains.com/plugin/6317-lombok/)

三、Lombok 详解

3.1 @Getter and @Setter 注解

你可以使用 @Getter 或 @Setter 注释任何类或字段,Lombok 会自动生成默认的 getter/setter 方法。

@Getter 注解

@Target({ElementType.FIELD, ElementType.TYPE}) @Retention(RetentionPolicy.SOURCE) public @interface Getter { // 若getter方法非public的话,可以设置可访问级别 lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC; AnyAnnotation[] onMethod() default {}; // 是否启用延迟初始化 boolean lazy() default false; }

@Setter 注解

@Target({ElementType.FIELD, ElementType.TYPE}) @Retention(RetentionPolicy.SOURCE) public @interface Setter { // 若setter方法非public的话,可以设置可访问级别 lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC; AnyAnnotation[] onMethod() default {}; AnyAnnotation[] onParam() default {}; }

3.2 Constructor Annotations

@NoArgsConstructor 注解

使用 @NoArgsConstructor 注解可以为指定类,生成默认的构造函数,@NoArgsConstructor 注解的定义如下:

@Target(ElementType.TYPE) @Retention(RetentionPolicy.SOURCE) public @interface NoArgsConstructor { // 若设置该属性,将会生成一个私有的构造函数且生成一个staticName指定的静态方法 String staticName() default ""; AnyAnnotation[] onConstructor() default {}; // 设置生成构造函数的访问级别,默认是public AccessLevel access() default lombok.AccessLevel.PUBLIC; // 若设置为true,则初始化所有final的字段为0/null/false boolean force() default false; }

@AllArgsConstructor 注解

使用 @AllArgsConstructor 注解可以为指定类,生成包含所有成员的构造函数,@AllArgsConstructor 注解的定义如下:

@Target(ElementType.TYPE) @Retention(RetentionPolicy.SOURCE) public @interface AllArgsConstructor { // 若设置该属性,将会生成一个私有的构造函数且生成一个staticName指定的静态方法 String staticName() default ""; AnyAnnotation[] onConstructor() default {}; // 设置生成构造函数的访问级别,默认是public AccessLevel access() default lombok.AccessLevel.PUBLIC; }

@RequiredArgsConstructorDemo 注解

使用 @RequiredArgsConstructor 注解可以为指定类必需初始化的成员变量,如 final 成员变量,生成对应的构造函数。

3.3 @EqualsAndHashCode 注解

使用 @EqualsAndHashCode 注解可以为指定类生成 equals 和 hashCode 方法。

3.4 @ToString 注解

使用 @ToString 注解可以为指定类生成 toString 方法

3.5 @Data 注解

@Data 注解与同时使用以下的注解的效果是一样的:

@ToString@Getter@Setter@RequiredArgsConstructor@EqualsAndHashCode

3.6 @Log 注解

若你将 @Log 的变体放在类上(适用于你所使用的日志记录系统的任何一种);之后,你将拥有一个静态的 final log 字段,然后你就可以使用该字段来输出日志。

@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);

@CommonsLog

private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);

3.7 @Synchronized 注解

@Synchronized 是同步方法修饰符的更安全的变体。与 synchronized 一样,该注解只能应用在静态和实例方法上。它的操作类似于 synchronized 关键字,但是它锁定在不同的对象上。 synchronized 关键字应用在实例方法时,锁定的是 this 对象,而应用在静态方法上锁定的是类对象。对于 @Synchronized 注解声明的方法来说,它锁定的是 $LOCK 或 $lock。

3.8 @Builder 注解

使用 @Builder 注解可以为指定类实现建造者模式,该注解可以放在类、构造函数或方法上。

3.9 @SneakyThrows 注解

@SneakyThrows 注解用于自动抛出已检查的异常,而无需在方法中使用 throw 语句显式抛出。

3.10 @NonNull 注解

你可以在方法或构造函数的参数上使用 @NonNull 注解,它将会为你自动生成非空校验语句。

 3.11 @Clean 注解

@Clean 注解用于自动管理资源,用在局部变量之前,在当前变量范围内即将执行完毕退出之前会自动清理资源,自动生成 try-finally 这样的代码来关闭流。

3.12 @With 注解

在类的字段上应用 @With 注解之后,将会自动生成一个 withFieldName(newValue) 的方法,该方法会基于 newValue 调用相应构造函数,创建一个当前类对应的实例。

3.13 其它特性

val

val 用在局部变量前面,相当于将变量声明为 final,此外 Lombok 在编译时还会自动进行类型推断

建议阅读猿码道大佬 十分钟搞懂Lombok使用与原理 这篇文章

四、参考资源

Lombok 官网lombok-cheatsheetJava开发神器Lombok的使用与原理
最新回复(0)