让我们拥抱Lombok吧
Lombok 是什么
Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。
为什么要使用lombok
繁琐的getset 以及构造器,让人看着心烦
private String name;
private String gender;
public String getName() {
return name;
}
public String getGender() {
return gender;
}
public void setName(String name) {
this.name = name;
}
public void setGender(String gender) {
this.gender = gender;
}
public Student2() {
}
public Student2(String name, String gender) {
this.name = name;
this.gender = gender;
}
添加一些新的功能链式编程
public static void main(String[] args) {
// 创建一个对象
Student stu = new Student();
// lombok set 方法支持链式编程
stu.setGender("man").setName("alone");
//
}
就是为了简化bean的书写
怎么用
一、添加依赖的jar包
<!-- cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>
<!-- aspectj -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.7.4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.4</version>
</dependency>
<!-- 简化 get set 方法的 正常只需要这一个即可-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.6</version>
</dependency>
说明:因为这个lombok依赖代理实现,所以为了避免一些无聊的问题,我们添加了切面,和动态代理的jar包,可以根据实际情况自行修改
按照你想要的功能,在相应的bean上直接添加注解即可
二、构造器篇
1.@NoArgsConstructor
无参数构造,当类中有final字段没有被初始化时,编译器会报错,此时可用@NoArgsConstructor(force = true),然后就会为没有初始化的final字段设置默认值 0 / false / null。对于具有约束的字段(例如@NonNull字段),不会生成检查或分配,因此请注意,正确初始化这些字段之前,这些约束无效。
2.@AllArgsConstructor
生成一个全参数的构造方法
3.@RequiredArgsConstructor
会生成构造方法(可能带参数也可能不带参数),如果带参数,这参数只能是以final修饰的未经初始化的字段,或者是以@NonNull注解的未经初始化的字段
@RequiredArgsConstructor(staticName = “of”)
会生成一个of()的静态方法,并把构造方法设置为私有的
三、基础注解使用篇
1.@Setter@Getter
默认生成的方法是public的,如果要修改方法修饰符可以设置AccessLevel的值,例如:@Getter(access = AccessLevel.PROTECTED)
2.@Accessors
主要用于控制生成的getter和setter
主要参数介绍
fluent boolean值,默认为false。此字段主要为控制生成的getter和setter方法前面是否带get/set
chain boolean值,默认false。如果设置为true,setter返回的是此对象,方便链式调用方法
prefix 设置前缀 例如:@Accessors(prefix = “abc”) private String abcAge 当生成get/set方法时,会把此前缀去掉
3.@NonNull
在方法或构造函数的参数上使用@NonNull,lombok将生成一个空值检查语句。避免空指针
4.@EqualsAndHashCode
生成hashCode()和equals()方法,默认情况下,它将使用所有非静态,非transient字段。但可以通过在可选的exclude参数中来排除更多字段。或者,通过在parameter参数中命名它们来准确指定希望使用哪些字段。
5.@ToString
生成toString()方法,默认情况下,它会按顺序(以逗号分隔)打印你的类名称以及每个字段。可以这样设置不包含哪些字段@ToString(exclude = “id”) / @ToString(exclude = {“id”,”name”})
如果继承的有父类的话,可以设置callSuper 让其调用父类的toString()方法,例如:@ToString(callSuper = true)
6.@Builder
注释为你的类生成复杂的构建器API。
Person.builder().name(“Adam Savage”).city(“San Francisco”).job(“Mythbusters”).job(“Unchained Reaction”).build();
7.@Delegate
生成一些列的方法,这些方法都来自与List接口
8.@Cleanup
自动帮我们调用close()方法,如果有流啊,之类的可以用
9.@Synchronized
给方法加上同步锁
10.@Data
自动为所有字段添加@ToString, @EqualsAndHashCode, @Getter方法,为非final字段添加@Setter,和@RequiredArgsConstructor!
11.@SneakyThrows
把checked异常转化为unchecked异常,好处是不用再往上层方法抛出了,美其名曰暗埋异常
四、日志注解使用篇
1.@Log
Creates private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());
2.@Log4j
Creates private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);
3.@Log4j2
Creates private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
4.@Slf4j
Creates private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
5.@XSlf4j
Creates private static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);
代码演示
import lombok.*;
import lombok.experimental.Accessors;
//增加set方法
@Setter
//增加get方法
@Getter
//启用支持链式编程风格
@Accessors(chain = true)
//添加无参数构造器
@NoArgsConstructor
//添加全参数的构造器
@AllArgsConstructor
public class Student {
private String name;
private String gender;
}
优缺点
增加了书写,让代码更加简洁了
降低了源代码文件的可读性和完整性,降低了阅读源代码的舒适度。