聊聊使用lombok @Builder踩到的坑
2021/9/15 13:04:58
本文主要是介绍聊聊使用lombok @Builder踩到的坑,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前言
什么是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("经理");
总结
很多时候没那么多的想当然
这篇关于聊聊使用lombok @Builder踩到的坑的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?
- 2024-05-09企业src漏洞挖掘-有意思的命令执行