关于lombok:聊聊使用lombok-Builder踩到的坑

3次阅读

共计 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("经理");

总结

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

正文完
 0