首页>>后端>>java->聊聊使用lombok @Builder踩到的坑

聊聊使用lombok @Builder踩到的坑

时间:2023-11-29 本站 点击:20

前言

什么是lombok

Lombok项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码。

对lombok不熟悉的朋友,可以阅读一下官方文档,再来看本文。官方文档如下

projectlombok.org/

正文

我们先来看一个小例子

提问: main函数会输出什么?

答案:空指针异常

Exceptioninthread"main"java.lang.NullPointerExceptionatcom.github.lybgeek.msg.test.User.addPositionList(User.java:25)atcom.github.lybgeek.msg.test.User.main(User.java:30)

回答出正确答案的朋友,下文基本上可以不用看了。可能有些朋友会有疑问,我例子中明明使用了

privateList<String>positionList=newArrayList<>();

为什么还会报空指针?

真相就在lombok用@builder生成的class文件中,我们看下使用@builder,生成的class文件反编译后长啥样

看到我圈红起来的,大家应该就一目了然。原来当我们用

Useruser=User.builder().username("张三").build();

时,此时user对象中的positionList就会被userBuilder中的positionList覆盖,而userBuilder中的positionList是null

如何解决

方法一:positionList前面加上final修饰

privatefinalList<String>positionList=newArrayList<>();

此时用@Budiler生成class为

此时user对象中的positionList用的还是原先的positionList,因此不会出现空指针异常

方法二:positionList前面加上@Builder.Default注解

@Builder.DefaultprivateList<String>positionList=newArrayList<>();

此时用@Budiler生成class为

publicstaticclassUserBuilder{privateStringusername;privatebooleanpositionList$set;privateList<String>positionList;UserBuilder(){}publicUser.UserBuilderusername(finalStringusername){this.username=username;returnthis;}publicUser.UserBuilderpositionList(finalList<String>positionList){this.positionList=positionList;this.positionList$set=true;returnthis;}publicUserbuild(){List<String>positionList=this.positionList;if(!this.positionList$set){positionList=User.$default$positionList();}returnnewUser(this.username,positionList);}

当positionList$set为false,会给userBuilder的positionList赋值为

User.$default$positionList();即:privatestaticList<String>$default$positionList(){returnnewArrayList();}

因此当user对象中的positionList被userBuilder中的positionList覆盖后,userBuilder中的positionList是new ArrayList(),此时就不会出现空指针现象

方法三:不用build实例化对象

Useruser=User.builder().username("张三").build();

改成用

Useruser=newUser();user.setUsername("张三");user.addPositionList("经理");

总结

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

作者:linyb极客之路


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/java/73.html