点击上方“Java知音”,选择“置顶公众号”
技术文章第一时间送达!
作者:semlinker
www.segmentfault.com/a/1190000020864572
一、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.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.10version>
<scope>providedscope>
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 注解的源代码,在 IDE 中会被高亮显示错误,针对这个问题可以通过安装 IDE 对应的插件来解决。
这里不详细展开,具体的安装方式可以参考:
https://www.baeldung.com/lombok-ide
三、Lombok 详解
注意:以下示例所使用的 Lombok 版本是 1.18.10
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 {};
}
使用示例
package com.semlinker.lombok;
@Getter
@Setter
public class GetterAndSetterDemo {
String firstName;
String lastName;
LocalDate dateOfBirth;
}
以上代码经过 Lombok 编译后,会生成如下代码:
package com.semlinker.lombok;
public class GetterAndSetterDemo {
String firstName;
String lastName;
LocalDate dateOfBirth;
public GetterAndSetterDemo() {
}
// 省略其它setter和getter方法
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
}
Lazy Getter
@Getter 注解支持一个 lazy 属性,该属性默认为 false。当设置为 true 时,会启用延迟初始化,即当首次调用 getter 方法时才进行初始化。
示例
package com.semlinker.lombok;
public class LazyGetterDemo {
public static void main(String[] args) {
LazyGetterDemo m = new LazyGetterDemo();
System.out.println("Main instance is created");
m.getLazy();
}
@Getter
private final String notLazy = createValue("not lazy");
@Getter(lazy = true)
private final String lazy = createValue("lazy");
private String createValue(String name) {
System.out.println("createValue(" + name + ")");
return null;
}
}
以上代码经过 Lombok 编译后,会生成如下代码:
package com.semlinker.lombok;
public class LazyGetterDemo {
private final String notLazy = this.createValue("not lazy");
private final AtomicReference lazy = new AtomicReference();// 已省略部分代码public String getNotLazy() {
return this.notLazy;
}public String getLazy() {
Object value = this.lazy.get();if (value == null) {
synchronized(this.lazy) {
value = this.lazy.get();if (value == null) {
String actualValue = this.createValue("lazy");
value = actualValue == null ? this.lazy : actualValue;this.lazy.set(value);
}
}
}return (String)((String)(value == this.lazy ? null : value));
}
}
通过以上代码可知,调用 getLazy 方法时,若发现 value 为 null,则会在同步代码块中执行初始化操作。
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;
}
示例
package com.semlinker.lombok;
@NoArgsConstructor(staticName = "getInstance")<