共计 1888 个字符,预计需要花费 5 分钟才能阅读完成。
前言
什么是 lombok
Lombok 我的项目是一个 Java 库,它会主动插入编辑器和构建工具中,Lombok 提供了一组有用的正文,用来打消 Java 类中的大量样板代码。
对 lombok 不相熟的敌人,能够浏览一下官网文档,再来看本文。官网文档如下
https://projectlombok.org/
注释
咱们先来看一个小例子
发问: main 函数会输入什么?
答案:空指针异样
Exception in thread "main" java.lang.NullPointerException
at com.github.lybgeek.msg.test.User.addPositionList(User.java:25)
at com.github.lybgeek.msg.test.User.main(User.java:30)
答复出正确答案的敌人,下文基本上能够不必看了。可能有些敌人会有疑难,我例子中明明应用了
private List<String> positionList = new ArrayList<>();
为什么还会报空指针?
假相就在 lombok 用 @builder 生成的 class 文件中,咱们看下应用 @builder,生成的 class 文件反编译后长啥样
看到我圈红起来的,大家应该就高深莫测。原来当咱们用
User user = User.builder().username("张三").build();
时,此时 user 对象中的 positionList 就会被 userBuilder 中的 positionList 笼罩,而 userBuilder 中的 positionList 是 null
如何解决
办法一:positionList 后面加上 final 润饰
private final List<String> positionList = new ArrayList<>();
此时用 @Budiler 生成 class 为
此时 user 对象中的 positionList 用的还是原先的 positionList,因而不会呈现空指针异样
办法二:positionList 后面加上 @Builder.Default 注解
@Builder.Default
private List<String> positionList = new ArrayList<>();
此时用 @Budiler 生成 class 为
public static class UserBuilder {
private String username;
private boolean positionList$set;
private List<String> positionList;
UserBuilder() {}
public User.UserBuilder username(final String username) {
this.username = username;
return this;
}
public User.UserBuilder positionList(final List<String> positionList) {
this.positionList = positionList;
this.positionList$set = true;
return this;
}
public User build() {
List<String> positionList = this.positionList;
if (!this.positionList$set) {positionList = User.$default$positionList();
}
return new User(this.username, positionList);
}
当 positionList$set 为 false,会给 userBuilder 的 positionList 赋值为
User.$default$positionList();
即:private static List<String> $default$positionList() {return new ArrayList();
}
因而当 user 对象中的 positionList 被 userBuilder 中的 positionList 笼罩后,userBuilder 中的 positionList 是 new ArrayList(),此时就不会呈现空指针景象
办法三:不必 build 实例化对象
把
User user = User.builder().username("张三").build();
改成用
User user = new User();
user.setUsername("张三");
user.addPositionList("经理");
总结
很多时候没那么多的想当然