关于lombok:聊聊使用lombok-Builder踩到的坑
前言什么是lombokLombok我的项目是一个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赋值为 ...