一、Lombok 的介绍
Lombok 能以简单的注解形式来简化 Java 代码,提高开发人员的开发效率。例如开发中经常需要写的javabean,都需要花时间去添加相应的 getter/setter 方法,也许还要去写构造器、equals、toString 等方法,而且还需要去维护,当属性多时会出现大量的 getter/setter 方法,这些显得很冗长也没有太多技术含量,一旦修改属性,就容易出现忘记修改对应方法的失误。
Lombok 能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString 方法。在源码中没有 getter/setter 方法,但是在编译生成的字节码文件中有 getter/setter 方法。这样就省去了手动重建这些代码的麻烦,使代码看起来更简洁。
二、Lombok 的引入
Lombok 的使用和引用 jar 包一样,可以在官网(https://projectlombok.org/download)下载 jar 包,也可以使用 Maven 添加依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency>
三、Lombok的使用
1、@Data
@Data 注解在类上时,会为该类的所有属性自动生成 setter/getter、equals、anEcqual、hashCode、toString 方法,如为 final 属性,则不会为该属性生成 setter 方法。
@Data集合了 @Getter / @Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor 的所有特性。
import lombok.Data;
@Data
public class User {
private int userId;
private String userName;
}
2、@Getter、@Setter
@Getter 和 @Setter 注解在属性上时,可以为相应的属性自动生成 Getter / Setter方法。
@Getter(AccessLevel.PROTECTED) 和 @Setter(AccessLevel.PROTECTED) 生成的方法是 protected。
import lombok.Getter;
import lombok.Setter;
public class User {
@Getter
@Setter
private int userId;
@Getter
@Setter
private String userName;
}
3、@ToString
类使用 @ToString 注解,Lombok 会生成一个 toString() 方法,默认情况下,会输出类名、所有属性(按照属性定义顺序),用逗号来分割。
@ToString(exclude = "column") :排除column 属性
@ToString(exclude = {"column","column2"}) :排除column,column2 属性
@ToString(of="column") :指定包含column 属性
@ToString(of={"column","column2"}) :指定包含column,column2 属性
import lombok.ToString;
@ToString(exclude="userId")
public class User {
private int userId;
private String userName;
private String userAge;
}
4、@EqualsAndHashCode
默认情况下,会使用所有非静态(non-static)和非瞬态(non-transient)属性来生成 equals 和 hasCode 方法,也能通过 exclude 注解来排除一些属性。
@EqualsAndHashCode:重写 equals 和 hashCode 方法
@EqualsAndHashCode(exculde="column"):排除column 属性
@EqualsAndHashCode(of="column"):指定包含column 属性
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(exclude="userId")
public class User {
private int userId;
private String userName;
private String userAge;
}
5、@NonNull
该注解用在属性或构造器上,Lombok 会生成一个非空的声明,可用于校验参数,能帮助避免空指针。
import lombok.NonNull;
public class NonNullExample extends Something {
private String name;
public NonNullExample(@NonNull Person person) {
super("Hello");
this.name = person.getName();
}
}
6、@Cleanup
该注解能帮助我们自动调用 close() 方法,很大的简化了代码。
import lombok.Cleanup;
import java.io.*;
public class CleanupExample {
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[10000];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
}
}
6、@NoArgsConstructor
自动生成无参构造器。
import lombok.Data;
@NoArgsConstructor
public class User {
private int userId;
private String userName;
}
@AllArgsConstructor
自动生成全参构造器,如果变量使用了 @NonNull, 会进行是否为空的校验。
import lombok.Data;
@AllArgsConstructor
public class User {
private int userId;
private String userName;
}
@RequiredArgsConstructor
自动生成部分参数构造器。
RequiredArgsConstructor: 会生成一个包含常量,和标识了NotNull的变量 的构造方法。生成的构造方法是private,如何想要对外提供使用可以使用staticName选项生成一个static方法。
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.NonNull;
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class ConstructorExample<T> {
private int x, y;
@NonNull private T description;
@NoArgsConstructor
public static class NoArgsExample {
@NonNull private String field;
}
}