java 基础默认值

java 基础默认值Lombok 以注解形式来简化 java 代码 提高开发效率 比如我们常用的 等 然最近在迭代中发现 Lombok version 或者低于这个版本 的 builder 模式与 new 实例化或者反射机制下实例化对象默认值不兼容 这里的默认值不是基本数据类型 Lombok 是通过注解的方式 在编译时自动为属性生成构造器 getter setter equals hashcode

大家好,我是讯享网,很高兴认识大家。



Lombok以注解形式来简化java代码,提高开发效率。比如我们常用的、、、、等。

然最近在迭代中发现Lombok(version:或者低于这个版本)的builder模式与new实例化或者反射机制下实例化对象默认值不兼容。这里的默认值不是基本数据类型

Lombok是通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方java 基础默认值法。可以通过反编译查看生成的字节码。例子:

使用方式如下

讯享网

  

这样写看着比以前的new A(),再set值方便多了,当然也可以在构造函数中直接传入需要的值。但是如果类的属性多了,就会发现Lombok使用以及开发效率上要高很多。

然而最近,在项目中使用的时候发现一个bug问题,项目中使用的Lombok的版本号1.16.20。如上面的例子,通过实例化后,发现a中的的默认值为null。究其原因,查看生成的class文件,有个A$Builder.class,使用javap -c A.class查看字节码或者直接将这个class文件拖拽到idea中,查看生成的代码,以下是在idea中展示class的代码

 

  

从中看到默认值没有。看出中的build()方法构造A对象的时候是使用内部类的属性值,所以这个初始化的实例我们的值为空。

经过查看Lombok下的代码发现有个根据注释,这个是能解决初始化默认值的。代码如下

讯享网

再看看生成的A$Builder.class文件的内容如下

 

可以看到代码中多了;这个就是确认是否需要设置默认值。

到这一步你以为就完美了吗??NO.

假如我们在Test方法中增加一行代码,如下,自己可以试试运行的结果看看输出的a与a1的结果

 

什么还需要new?有些场景中,比如其他第三方库使用这个类的时候,就不是通过builder模式来实例化对象,第三方库一般都是通过反射机制来实例化,然Lombok给我编译出来的class字节码已经不再是原有的。所以就出现问题了。

Lombok应该也发现了,在1.18.2以上fix这个bug了。大家可以试试。所以建议大家升级下版本

至于Lombok是如何实现的。可以研究下.里面有具体逻辑

小讯
上一篇 2024-12-26 17:51
下一篇 2024-12-26 08:37

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/10704.html