目录
一 IDE语法支持
为了让IDE能支持Lombok,需要安装IDE插件,以Mac IDEA为例,打开设置界面:
点击Brow repositories,搜索Lombok
安装完后,重启IDE即可。
二 添加Maven依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
三 常用注解解析
简单注解:@Getter @Setter @ToString @EqualsAndHashCode @NoArgsConstructor @AllArgsConstructor @Cleanup @NonNull
@val @var
简单注解组合:@Data @Value
日志注解:@Log @CommonsLog @Log4j @Log4j2 @Slf4j
构造器注解:@Builder @Singular
提供了但是功能很软肋的注解:@RequiredArgsConstructor @Synchronized @SneakyThrows
简单注解
@Getter
可以用在类和类属性上面,当用在类上面表示自动生成全部属性的get方法,当用属性上面表示自动生成对应属性的get方法。
这里仅演示注解在属性的示例:
public class GetterTest {
@Getter
private String name = "涂有";
private String age;
public static void main(String[] args) {
var getterTest = new GetterTest();
System.out.println(getterTest.getName());
}
}
自动生成的字节码反编译代码:
public class GetterTest {
private String name = "涂有";
private String age;
public GetterTest() {
}
public static void main(String[] args) {
GetterTest getterTest = new GetterTest();
System.out.println(getterTest.getName());
}
public String getName() {
return this.name;
}
}
@Setter
和@Getter注解使用方法一样,自动生成对应的set方法,这里不做过多解释
@ToString
注解在类上面,自动生成toString方法,不打印静态属性,ToString.includeFieldNames属性表示是否打印属性名称(默认true),ToString.exclude表示哪些属性不打印,ToString.callSuper表示是否打印父类属性(默认false),其他的属性请求自行查阅源码
@ToString
public class ToStringTest {
private int age = 100;
private String name = "涂有";
}
自动生成的字节码反编译代码:
public class ToStringTest {
private int age = 100;
private String name = "涂有";
public ToStringTest() {
}
public String toString() {
return "ToStringTest(age=" + this.age + ", name=" + this.name + ")";
}
}
@EqualsAndHashCode
作用于类上,自动生成equals和hashCode方法
@NoArgsConstructor
作用于类上,自动生成无参构造函数
@AllArgsConstructor
作用于类上,自动生成全部参数的构造函数,但是这样会覆盖掉隐式无参构造函数,和我们直接编写有参构造函数一样,也会覆盖隐式无参构造函数
@Cleanup
作用于局部变量,会自动关闭实现Closeable接口的变量
@Cleanup InputStreamReader sr = new InputStreamReader(System.in);
char c = 0;
while ((c = (char)sr.read()) != 0) {
System.out.println(c);
}
自动生成的字节码反编译代码:
try {
InputStreamReader sr = new InputStreamReader(System.in);
try {
boolean var4 = false;
char c;
while((c = (char)sr.read()) != 0) {
System.out.println(c);
}
} finally {
if (Collections.singletonList(sr).get(0) != null) {
sr.close();
}
}
} catch (IOException var9) {
var9.printStackTrace();
}
@NonNull
检测变量是否为空,如果为空自动抛出NullPointException,作用于属性、方法参数、方法返回类型、本地变量,但是我发现只有写在方法参数上才起作用
@val
作用于局部常量,自动推算常量类型
public static void main(String[] args) {
val name = "tuyou";
//name = "tuyou2"; //编译报错
}
@var
作用于局部变量,自动推算变量类型
public static void main(String[] args) {
var name = "tuyou";
name = "tuyou2";
}
简单注解组合
@Data
作用于类,是@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode组合
@Value
作用于类,是@Getter @AllArgsConstructor @ToString @EqualsAndHashCode的组合
日志注解
注意:在项目根目录下面创建lombok.config,并配置:
lombok.log.fieldName=LOGGER
可以修改自动生成的日志变量名称。
@Log
作用于类,自动为类生成一个日志变量,方便直接用。
@Log
public class LogTest {
public static void main(String[] args) {
log.info("日志");
}
}
@CommonsLog
同上
@Log4j
同上
@Log4j2
同上
@Slf4j
同上
构造器注解
@Builder
这个类型和Builder(构造器)设计模式对应,自动为类实现Builder模式
@Data
@Builder
public class BuilderTest {
private String name;
private int age;
public static void main(String[] args) {
BuilderTest obj = BuilderTest.builder().name("涂有").age(25).build();
System.out.println(obj);
}
}
@Singular
配合@Builder使用,作用于集合属性,为集合属性提供add方法
@Data
@Builder
public class BuilderTest {
private String name;
private int age;
@Singular("addAddress")
private List<String> address;
public static void main(String[] args) {
BuilderTest obj = BuilderTest.builder().name("涂有").age(25).addAddress("chengdu").build();
System.out.println(obj);
}
}
提供了但是功能很软肋的注解
@RequiredArgsConstructor
自动为final属性和@NonNull的属性添加构造函数,不好控制,不好用
@Synchronized
作用于方法,把方法变成一个同步方法,还不如直接写synchronized可读性强
@SneakyThrows
作用于方法和构造函数,隐式抛出异常,还不如直接写throws可读性强