Lombok
官方文档:https://projectlombok.org/features/all
解决的痛点问题
原始的java object(POJO)
- private fields,每一个field都需要有setter/getter方法
- constructor
- toString() method
- finally bock
这些代码都是可以优化的
优势
- 通过注解方式,优化了冗余代码
- 和主流的IDE结合的很好
主要内容
check for Nulls
@NonNull @Setter
private String employeeId;
等价于
public id setEmployeeId(@NonNull final String employeeId){
if(employeeId == null) throw new java.lang.NullPointerException("employeeId");
this.employeeId = employeeId;
}
Concise Data Objects
@Getter @Setter private String columnName;
等价于
private String columnName;
public String getColumnName(){
return this.columnName;
}
public void setColumnName(String columnName){
this.columnName = columnName;
}
其他注解
@EqualsAndHashCode
@ToString(exclude={"columnLabel"})
public class ColumnBean {
private BigDecimal id;
private String columnName;
private String columnLabel;
}
@Data
public class ColumnBean {
@NonNull
private BigDecimal id;
@NonNull
private String columnName;
@NonNull
private String columnLabel;
}
@Data
-
为所有non-static的属性生成getter/setter
-
多个构造函数(所有参数,任意参数,非空的field参数)
-
toString()
-
equals()
-
hashcode()
@AllArgsConstructor @NoArgsConstructor @RequiredArgsConstructor
Builder
当一个object有很多属性的时候,传统的构造函数传入很多参数,易读性差,使用builder的可读性更好。
Object对外暴露getter操作,不暴露setter,通过builder来set值
@Builder
public class Officer {
private final String id;
private final String name;
private final int age;
private final String department;
}
//创建对象
Officer officer = Officer.builder()
.id("00001")
.name("simon qi")
.age(26)
.department("departmentA")
.build();
toBuilder = true, 表示允许修改原对象。默认为false
officer = officer.toBuilder()
.id("00002")
.build();
Clean up
容易清理资源。例如关闭资源
@Cleanup InputStream inputStream = new FileInputStream(args[0]);
@Cleanup OutputStream outputStream = new FileOutputStream(args[1]);
byte[] b = new byte[10000];
while (true) {
int r = inputStream.read(b);
if (r == -1) break;
outputStream.write(b, 0, r);
}
等价于
InputStream in = new FileInputStream(args[0]);
try {
OutputStream out = new FileOutputStream(args[1]);
try {
byte[] b = new byte[10000];
while (true) {
int r = in.read(b);
if (r == -1) {
break;
}
out.write(b, 0, r);
}
} finally {
if (out != null) {
out.close();
}
}
} finally {
if (in != null) {
in.close();
}
}
Lock
保证同一时刻,只有一个thread可以执行这个方法。注解仅可以用于static和instance方法。
@Synchronized
public static void helloLombok(){
System.out.println("Lombok");
}
Logging
@Log4j2
public class ClassName(){
. . .
// Use log variable as needed
}
等价于
public class ClassName(){
private static final org.apache.log4j.Logger log =
org.apache.log4j.Logger.getLogger(ClassName.class);
. . .
// Use log variable as needed
}
Exception
对于一些必须catch异常的地方,但是又不做特殊处理,只想throw exception是,可以使用@SneakyThrows
@SneakyThrows
public void run() {
throw new Throwable();
}
等价于
public void run() {
try {
throw new Throwable();
} catch (Throwable t) {
throw Lombok.sneakyThrow(t);
}
}