广告
返回顶部
首页 > 资讯 > 精选 >如何解决Java中Lombok @Value注解导致的variable not been initialized问题
  • 676
分享到

如何解决Java中Lombok @Value注解导致的variable not been initialized问题

2023-06-20 18:06:17 676人浏览 安东尼
摘要

本篇内容介绍了“如何解决Java中Lombok @Value注解导致的variable not been initialized问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情

本篇内容介绍了“如何解决Java中Lombok @Value注解导致的variable not been initialized问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

目录
  • 背景

  • 解决

背景

想要修改一个POJO类,在其中增加一个字段,但是增加以后就开始报错:

如何解决Java中Lombok @Value注解导致的variable not been initialized问题

  • 该类已经存在一个构造函数,为了不破坏该类原来的使用方式,于是重新写了一个构造方法,之前的构造函数未改动。

  • 该类被Lombok的@Value注解修饰

解决

  • 报错信息显示,变量未被初始化。于是主要排查是否有被初始化。

  • 在重写的构造方法中,我已经对该变量进行了初始化。

  • 不明所以,开始找不同,这个类中,唯一不熟悉的就是@Value注解,于是查看注解中的注释:

@Target(ElementType.TYPE)@Retention(RetentionPolicy.SOURCE)public @interface Value {  String staticConstructor() default "";}

这个注解的作用是为一个不可变的实体类生成一系列与之匹配的代码。效果等同于以下注解的组合:@Getter @FieldDefaults(makeFinal=true, level=AccessLevel.PRIVATE) @AllArgsConstructor @ToString @EqualsAndHashCode。

这其中有一个注解比较特殊,@FieldDefaults(makeFinal=true, level=AccessLevel.PRIVATE),见名知意,这是一个为字段设置默认属性的注解,注解的属性值中,标注了是否设置实例字段为final,访问级别设置为private。

@Target(ElementType.TYPE)@Retention(RetentionPolicy.SOURCE)public @interface FieldDefaults { AccessLevel level() default AccessLevel.NONE; boolean makeFinal() default false;}

若makeFinal是true,则每个实例字段(被@NonFinal注解修饰的除外)都会被final修饰符修饰。
若level属性有值,那么每个包私有访问的(即没有访问修饰符修饰)和没有被@PackagePrivate注解修饰的实例字段都会被添加一个与属性值对应的修饰符。

也就是说,@Value标记了此POJO类为不可能变的类,其所有没有被@NonFinal注解修饰的成员变量,都会被final修饰

事情到了这里,还是不知道问题在哪里(Java基础差)。继续找解决办法。

Google搜索找到此问答:

Lombok @Wither, @Value, @NoArgsConstructor, @AllArgsConstructor do not work together

回答中有一段对于Java final的描述:

A final variable can only be initialized once, either via an initializer or an assignment statement. It does not need to be initialized at the point of declaration: this is called a "blank final" variable. A blank final instance variable of a class must be definitely assigned in every constructor of the class in which it is declared; similarly, a blank final static variable must be definitely assigned in a static initializer of the class in which it is declared; otherwise, a compile-time error occurs in both cases.

翻译如下:
一个final修饰的变量只能通过初始化器或赋值语句初始化一次。它不需要在声明处初始化:这被称为“空白final”变量。类的空白final实例变量必须在声明它的类的每个构造函数中确定赋值;同样,空白final静态变量必须在声明它的类的静态初始化器中明确赋值;否则,以上两种情况下都会发生编译错误。

真相大白,原因是在原来的构造器中没有对新加入的字段进行初始化。至此,问题解决。

“如何解决Java中Lombok @Value注解导致的variable not been initialized问题”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 如何解决Java中Lombok @Value注解导致的variable not been initialized问题

本文链接: https://www.lsjlt.com/news/298933.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作