发现问题
在实际项目中遇到使用lombok @Builder发生对象属性值互相调换的情况,百思不得其解。将原代码重复的构造函数删除,问题解决。
还原现场
- 构建User类,使用@Builder注解,main方法使用builder构建对象,打印对象,展示属性。
- 增加全属性构造函数,参数列表不按照类属性声明顺序(name,age顺序调换),运行main,发现对象name和age属性互相调换。
问题分析
lombok的@Builder原理是为类生成了一个静态内部类User.UserBuilder,当我们为User.UserBuilder设置属性完毕后调用build()方法构造一个新的对象,build()调用了一个自动生成的全参构造器,构造器的参数列表的顺序是按照类属性声明的顺序来的。
在本案例中出现了一个手动增加的全参构造器,构造器参数顺序和类属性声明顺序不一致,@Builder发现已经有了全参构造器就不会再自动生成全参构造器了,否则会编译报错。build()最终调用手写的全参构造器,导致对象属性赋值错乱,让人觉得很奇怪。。。
这里建议在使用lombok时不要自己再写类似setter, getter, 全参构造器的代码了。