前言
前阵子闲逛的时候,留意到了Lombok这个Java第三方库,后来亲自试用了一下,还真有一种相见恨晚的感觉,对于博主这样的懒人来说,这简直是太实用了。这不趁周末,赶紧把好东西写出来分享一下。
Lombok
引述官网介绍:
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.Never write another getter or equals method again. Early access to future java features such as val, and much more.
Lombok是一个java库,它可以自动插入您的编辑器和构建工具,为您的java提供帮助。再也不要写其他的getter或equals方法了。尽早访问诸如val之类的未来java特性。
Tip:单人项目开发中使用极佳,或多人协作开发中强制要求使用相同环境。因为需要配置的原因,但目前编辑器和编译器还没有那么智能和友善o(╥﹏╥)o...
效果
- 未使用Lombok前的POJO大概是这样的(为了方便,下面把Entity、DTO、VO之类的都统称为POJO)
public class User {
private Integer id;
private String nickname;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
@Override
public String toString() {
return "User{" +
"nickname='" + nickname + '\'' +
", id=" + id +
'}';
}
}
- 使用了Lombok之后的POJO大概是这样的
@Data
public class User {
private Integer id;
private String nickname;
}
搭建
- 添加依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
- 下载插件(IDEA)
- 配置支持
PS:IDEA中的Spring Initializr已集成Lombok,新建Spring Boot项目的时候勾选Lombok选择即可
说明图
下面先来看下Lombok中几个主要常用注解介绍说明图:
具体说明
-
@Data
(常用)
在类上使用此注解,相当于为当前类的非final字段添加了getter()、setter()、toString()、equals()以及hashCode()方法,同时这也是一个多功能组合注解,组合了下面的@ToString,@EqualsAndHashCode,@Getter,@Setter和@RequiredArgsConstructor这五个注解
-
@Builder
(常用)
此注解需用在类上。Lombok底层通过构造者模式来转换当前类,在项目实际使用的时候,我们可以以参数链的形式组装该对象,或者是以全参构造器的形式来new一个当前对象。当组合使用@Data注解的时候(一般来说是没必要的),Lombok也不会再为当前对象生成getter()、setter()方法。使用链式构造一个对象会显得更加优雅,所以这个注解也是非常实用的
-
@Builder.Default
(常用)
此注解用在字段上。当前类使用了@Builder进行构造且某些字段含有默认值的情况下,需要为这些字段添加此注解,不加此注解默认值在构造的时候是不生效的,需要进行手动设值
-
@Slf4j
(常用)
private final Logger logger = LoggerFactory.getLogger(getClass());
上面这段代码很熟悉吧。为当前类添加@Slf4j后,我们就可以舍弃这段代码了,是不是简洁多了
-
val, var
(常用)
val将局部变量申明为final类型,而var则用于修饰变量但不是final类型
val noLombok = new HashSet<String>();
var noLombok2=new ArrayList<Integer>();
////=> 以上这段代码相当于:
final Set<String> useLombok = new HashSet<>();
List<Integer> useLombok2=new ArrayList<>();
-
@NonNull
(常用)
该注解能够为方法,或构造函数的参数提供非空检查
public void notNull(@NonNull String arg) {
}
//=> 以上这段代码相当于:
public static void notNull(String arg) {
if (arg != null) {
} else {
throw new NullPointerException("arg");
}
}
-
@Cleanup
(较常用)
常用于资源释放
public void CleanUp() {
try {
@Cleanup Jedis jedis = redisService.getJedis();
} catch (Exception e) {
e.printStackTrace();
}
//=> 以上这段代码相当于:
Jedis jedis = null;
try {
jedis = redisService.getJedis();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (jedis != null) {
try {
jedis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
-
@Synchronized
(较常用)
类似于 Synchronized 关键字,但是可以隐藏同步锁
public class SynchronizedExample {
private final Object readLock = new Object ();
@Synchronized
public static void test1() {
System.out.println("test1");
}
@Synchronized("readLock")
public void test2() {
System.out.println("test2");
}
}
//=> 以上这段代码相当于:
public class SynchronizedExample {
private static final Object $LOCK = new Object[0];
private final Object readLock = new Object ();
@Synchronized
public static void test1() {
synchronized($LOCK) {
System.out.println("test1");
}
}
@Synchronized("readLock")
public void test2() {
synchronized(readLock) {
System.out.println("test2");
}
}
}
-
@NoArgsConstructor, @RequiredArgsConstructor、@AllArgsConstructor
(较常用)
分别对应可生成无参构造器,指定参数的构造器和包含全部字段的构造器。第1个和第3个注解还是比较挺实用的,如果要生成部分参数的构造器,博主是比较建议手动生成,感觉注解还不太好用了。(注意:当类中有final字段没有被初始化时,编译器就会报错,此时可用@NoArgsConstructor(force = true),然后就会为没有初始化的final字段设置默认值 0 / false / null。而对于具有约束的字段(如@NonNull字段),则不会生成检查或分配,因此要注意正确初始化final修饰的字段,否则这些约束都是无效的
-
@Getter、@Setter、@ToString、@EqualsAndHashCode
(不常用)
这几个注解都很好理解,见其名知其意,只是要注意注解的使用位置。对于@Getter和@Setter,默认生成的方法是public的,如果要修改方法的修饰符,可以设置AccessLevel的值,如:@Getter(access = AccessLevel.PROTECTED)
-
@Value,@SneakyThrows ...
(目测不常用)
一些注解的具体用法还是参考Lombok官网吧
小结
具体到实现原理方面,在下面的参考链接中也有相关的介绍,感兴趣的还请自行研究。结合最近的使用情况,觉得最舒服的就是临时加字段的情况下,也不需要我们再补上getter()、setter()和toString()。一般来说,我们只需要在POJO上用@Data
一个注解就基本满足了,还有@NoArgsConstructor,@AllArgsConstructor
这两个注解有时候也经常用得上。