Lombok踩坑记:学习路上的小插曲!

时间:2024-11-11 14:44:20作者:技术经验网浏览:67

舒服了,学习了,踩到一个 Lombok 的坑!

大家好,我是你们的老朋友,一位热衷于软件工程的开发者。最近,我在项目中遇到了一个颇为有趣的挑战,这次我踩到了一个 Lombok 的坑,这个过程让我受益匪浅,现在就来和大家分享一下我的经历。

让我们回顾一下 Lombok 这个神奇的工具。Lombok 是一个 Java 库,它可以通过注解的方式来简化 Java 代码,自动为类生成 getter、setter、equals、hashCode 等方法,以及构造器、builder 等。这极大地提高了我们的开发效率,减少了模板代码的编写量。正如所有的工具一样,Lombok 也有其潜在的陷阱和需要注意的地方。

一、问题的起源

在我负责的一个项目中,有一个公共的服务接口,这个接口已经稳定运行了很长时间,并且与多个系统进行了对接。由于这是一个基础服务,它的稳定性至关重要。因此,在一年前,这个接口就已经交接给了另一位同事进行维护。

最近,一个新服务需要与这个接口进行对接。同事在对接过程中遇到了一个诡异的问题:新服务在调用接口时,抛出了一个空指针异常。这个异常让我们都感到有些摸不着头脑,因为接口本身已经稳定运行了很长时间,而且之前的对接都没有出现过类似的问题。

二、初步分析

在查看异常日志后,我们很快定位到了问题所在的代码行。这一行代码是在处理接口入参对象 reqDto 的时候,尝试获取其中一个字段的值。由于 reqDto 有很多字段,我们首先排除了 field1 为 null 的可能性,因为有默认值。然后,我们怀疑可能是 reqDto 本身为 null,但是通过打印关键字段的值,我们发现这个假设并不成立。

接下来,我们怀疑可能是部署的代码版本与我们查看的版本不一致。但是,经过与测试同学的确认,我们排除了这个可能性。此时,我们已经排除了所有可能的外部因素,问题似乎指向了代码本身。

三、深入调查

在仔细检查了报错的代码行之后,我们开始怀疑是不是在调用接口时,传递进来的 field1 被主动设置为了 null。虽然这样的代码看起来有些不合逻辑,但在排查问题时,我们不能放过任何可能性。于是,我们查看了调用方构建参数的代码,发现他们使用的是 builder 模式来构建对象。

在查看了调用方的代码后,我们发现他们并没有对 Boolean 类型的 field1 进行显式的设值。由于 field1 有默认值 true,调用方认为没有必要进行设值。正是这种“偷懒”的做法,让我们陷入了困境。

四、问题的真相

经过一系列的调查和分析,我们终于找到了问题的真相。原来,在使用 Lombok 的 @Builder 注解时,如果字段没有显式的默认值,那么在使用 builder 构建对象时,这些字段将不会被初始化。也就是说,虽然我们在类定义中为 field1 设置了默认值 true,但是在使用 builder 构建对象时,这个默认值并没有被使用。

为了解决这个问题,我们找到了 Lombok 提供的一个注解:@Builder.Default。这个注解可以告诉 Lombok 在使用 builder 构建对象时,为指定的字段使用默认值。于是,我们在 field1 的定义上添加了这个注解,并重新运行了 Demo。果然,问题得到了解决,接口再次稳定运行。

五、背后的原因

在解决了问题之后,我们不禁要问:为什么 Lombok 不直接使用字段的默认值呢?经过查阅 Lombok 的文档和相关的讨论,我们找到了答案。

Lombok 的设计理念是尽量减少模板代码的编写量,提高开发效率。在实现这一目标的过程中,Lombok 也面临着一些挑战。其中之一就是如何处理字段的默认值。在 Java 中,字段的默认值是由 JVM 在对象创建时自动赋值的。但是,在使用 builder 模式构建对象时,Lombok 需要自己控制对象的创建过程。这就导致了一个问题:Lombok 不知道如何知道一个字段是否有默认值。

为了解决这个问题,Lombok 引入了 @Builder.Default 注解。这个注解可以告诉 Lombok 在使用 builder 构建对象时,为指定的字段使用默认值。这样一来,Lombok 就能够知道哪些字段有默认值,从而在构建对象时进行相应的处理。

当然,这种做法也带来了一些额外的开销。开发者需要显式地指定哪些字段有默认值。这虽然增加了代码的冗余度,但也提高了代码的可读性和可维护性。Lombok 需要对使用了 @Builder.Default 注解的字段进行特殊处理。这可能会增加编译时的开销和复杂度。但是,在权衡利弊之后,Lombok 选择了这种做法来确保代码的正确性和稳定性。

六、经验总结

通过这次踩坑的经历,我们学到了很多宝贵的经验。我们要对所使用的工具和库有深入的了解。只有这样,我们才能充分发挥它们的优势,避免潜在的问题。我们要注意代码的可读性和可维护性。虽然 Lombok 可以帮助我们减少模板代码的编写量,但我们也应该避免过度依赖它,以免陷入一些难以察觉的问题中。我们要善于总结和

文章评论