所谓开卷有益,就是一读就能发现好东西。SIA5一开始就介绍了LOMBOK这个库,这个库也能在start.spring.io的starter中找到,确实是一个不错的库,简化了大量的冗长样板代码。
库的官方地址是:https://projectlombok.org。其中的feature有个快速入门,简单学习了一下:
val
这个是一种数据类型,导入之后使用,可以用在方法内的本地变量中,实际上就是一个万能的类型符号,外加带有final功能。
var
作为和val类似,但是没有final功能。val和var都是为了让简单的方法写起来更简单明了。
@NonNull
可以用在方法参数,构造器,让lombok帮你检查是不是为空。如果为空,会抛一个空指针错误告诉你哪里为空。对于构造器,会在super()或者this()方法之后立刻调用这个检查。如果类顶部已经有该检查,不会重复生成检查。
支持application文件中如下配置,意思一看便知:
lombok.nonNull.exceptionType = [NullPointerException | IllegalArgumentException] (default: NullPointerException)
,设置抛出的错误是空指针还是参数错误。
lombok.nonNull.flagUsage = [warning | error] (default: not set)
,配置每一次检测失败是warning还是error。
@Cleanup
在当前作用域结束的时候,自动调用被@Cleanup修饰的对象的.close()方法。
lombok.cleanup.flagUsage = [warning | error] (default: not set)
,执行失败的时候异常还是error
@Getter and @Setter
详细控制每一个域的getter和setter方法有没有。加上注解就会自动生成对应的方法。如果用在类上,除了静态成员之外都会有对应的方法。
生成的方法默认是public,可以设置AccessLevel来修改,可以看例子:
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
public class GetterSetterExample {
@Getter @Setter private int age = 10;
@Setter(AccessLevel.PROTECTED) private String name;
@Override public String toString() {
return String.format("%s (age: %d)", name, age);
}
}
@ToString
修饰类,自动生成该方法。
可以使用@ToString.Exclude或者Include来包含和去掉某些域,也可以把无参的实例方法的结果包含在其中。
includeFieldNames设置为true,表示把字段名包含在结果里,会让打印出的结果长一些。
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
public class GetterSetterExample {
@Getter @Setter private int age = 10;
@Setter(AccessLevel.PROTECTED) private String name;
@Override public String toString() {
return String.format("%s (age: %d)", name, age);
}
}
lombok.toString.includeFieldNames= [ true| false]
,是否包含字段名
@EqualsAndHashCode
顾名思义,生成对应方法。默认会使用所有非静态和非瞬态字段,可以自行设置。由于不好用于继承的类,所以一般用于数据类。
@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
生成构造器。第一个是无参构造器,第二个是有参构造器,第三个是两个构造器都生成。如果因为final变量无法进行无参构造,可以加上@NoArgsConstructor(force = true)
,这样final变量会被初始化成0/false/null。
有参构造对每一个普通类变量和没有初始化的final变量生成构造器。
还可以设置@RequiredArgsConstructor(staticName = "of")
来使用Person.of("jenny", 18)这样的方法来构造。
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;
}
}
@Data
等于@ToString, @EqualsAndHashCode, 所有变量的@Getter,非final变量的@Setter和@RequiredArgsConstructor。所以记得对于Entity,很多时候需要补一个无参构造器。
@Builder
允许链式调用的方式设置属性,在类,构造器和方法上都能用。
这个比较复杂,用到的时候再看。