前言

什么是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("经理");

总结

很多时候没那么多的想当然