初识Lombok
一、Lombok简介
Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。
使用Lombok前需要在idea上安装Lombok插件,如图:
然后需要在我们的项目中导入Lombok的jar文件:
lombok-1.18.0.jar
然后我们创建一个JavaBean:Car
package main.java.StuLomBok;
public class Car {
private String id;
private String brand;
private String color;
private double price;
}
这个JavaBean 只有几个字段,getter、setter等都没有。
接下来,我们就详细的介绍一下,如何使用Lombok的注解为该JavaBean在编译时自动添加getter、setter、构造器等一系列的方法的。
二、Lombok中的注解及使用
1、@Getter 和 @Setter
我们可以使用这两个注解为JavaBean中的字段,自动生成默认的getter和setter方法:
public class Car {
@Getter @Setter private String id;
@Getter @Setter private String brand;
@Getter @Setter private String color;
@Getter @Setter private double price;
}
@Getter 和 @Setter 还可以用在类上面,生成所有字段的getter和setter:
@Getter
@Setter
public class Car {
private String id;
private String brand;
private String color;
private double price;
}
默认生的getter和setter方法是public的,我们可以使用AccessLevel修改方法的访问权限,如下:
@Getter(value = AccessLevel.PROTECTED)
2、@ToString
类注解,用于生成toString()方法,默认按顺序(以逗号隔开)打印类名和每个字段。
@ToString
public class Car {}
我们还可以设置toString()方法仅包含哪些字段:of
@ToString(of = {"id","brand"})//of,设置toString方法包括哪些字段
public class Car {}
设置toString()方法不包括哪些字段:exclude
@ToString(exclude = {"color"})//exclude,设置toString方法不包括哪些字段
public class Car {}
设置可以调用父类的构造方法:callSuper
@ToString(of = {"id","brand","color"},callSuper = true)
public class Car {}
3、@EqualsAndHashCode
生成equals() 和 hashcode()方法,默认使用所有非静态、非transient字段。同样,我们可以使用of、exclude、callSuper属性设置包含或不包含哪些字段以及是否调用父类的equals和hashcode()方法。
@EqualsAndHashCode(of = {"id","brand","color"},exclude = {"price"})
public class Car {}
@EqualsAndHashCode(callSuper = true)
class BWM extends Car{ }
4、@NoArgsConstrutor、@RequiredArgsConstructor、AllArgsConstructor
- @NoArgsConstructor:
生成一个无参构造方法。当啊类中有final字段没有被初始化时,编译器会报错,此时可用force属性,为没有初始化的final字段设置默认值0/false/null。对于具有例如 @NonNull 约束的字段,不会生成检查或分配默认值。
@NoArgsConstructor(force = true)
public class Car {
@NonNull private String id;
@NonNull private String brand;
@NonNull private String color;
@NonNull private double price;
public final String owner;
}
- @RequiredArgsConstructor
会生成构造方法(可能带参数也可能不带参数),如果带参数,这参数只能是以final修饰的未经初始化的字段,或者是以@NonNull注解的未经初始化的字段。可以使用 staticName = “of” 生成一个静态的of()方法,并把构造方法设为私有的。
@RequiredArgsConstructor(staticName = "of")
public class Car {
@NonNull private String id;
@NonNull private String brand;
@NonNull private String color;
@NonNull private double price;
public final String owner;
}
- @AllArgsConstructor
生成一个全参的构造方法。
5、@Data
@Data 组合了 @ToString、@EqualsAndHashCode、@Getter / @Setter和@RequiredArgsConstructor的功能
6、@Accessors
控制生成的getter和setter,主要参数介绍:
- fluent:boolean值,默认为false。控制生成的getter和setter方法前面是否带get/set;
- chain:boolean值,默认false。如果设置为true,setter返回的是此对象,方便链式调用方法;
- prefix:设置前缀 例如:@Accessors(prefix = "abc") private String abcAge 当生成get/set方法时,会把此前缀(abc)去掉。
@Accessors(prefix = {"abc_"})//生成getter和setter时去掉字段前缀
public class Car {
private String abc_id;
private String abc_brand;
}
7、@Synchronized
方法级别的注解,给方法加同步锁。
@Synchronized
public void driver(){}
8、@Wither
提供了给final字段赋值的一种方法。
9、@onXXX
在注解里面添加注解的方式。
10、@Builder
生成复杂的构建器API。
11、@Delegate
为该类生成一系列来自于List接口的方法。