IT袋

当前位置:主页 > 经验教程 > 建站编程 >

详解Lombok的坑

详解Lombok的坑 Lombok使用中需注意的问题(5)

时间:2024-03-25 20:25:01 来源:IT袋 作者:马勇
导读:详解Lombok的坑,@NoArgsConstructor,这是个啥东西? 这不就是让 lombok 给我们搞一个无参构造函数吗? 搞无参构造函数的时候,不是得针对有默认值的字段,进行一波默认值

详解Lombok的坑

详解Lombok的坑

@NoArgsConstructor,这是个啥东西?

这不就是让 lombok 给我们搞一个无参构造函数吗?

搞无参构造函数的时候,不是得针对有默认值的字段,进行一波默认值的初始化吗?

这个算一次了。

前面我们分析了 @Builder.Default 也要对有默认值的字段初始化一次。

所以是 twice,而且这两次干得都是同一个活。

开发者一看,这不行啊,得优化啊。

于是把 @NoArgsConstructor 的初始化延迟到了 @Builder.Default 里面去,让两次合并为一次了。

这样一看,用 Builder 模式的时候确实没问题了,但是用 new 的时候,默认值就没了。

这是一种经典的顾头不顾尾的解决问题的方式。

作者可能也没想到,大家在使用的时候会把 @Builder 和 @NoArgsConstructor 两个注解放在一起用。

作者可能还觉得委屈呢:这明明就是两种不同的对象构建方式啊,二选一就行了,你要放在一起?哎哟,你干嘛~

接着一个叫做 davidje13 的老哥接过了话茬,顺着 omega09 老哥的话往下说,他除了解释两个注解放在一起使用的场景外,还提到了一个词:least-surprise。

详解Lombok的坑

least-surprise,是一个软件设计方面的词汇,翻译过来就是最小惊吓原则。

简单来说就是我们的程序所表现出的行为,应该尽量满足在其领域内具有一致性、显而易见、可预测、遵循惯例。

比如我们认为的惯例是 new 对象的时候,如果有默认值会附上默认值。

结果你这个就搞没了,就不遵循惯例了。

当然,你还是可以拿出那句万金油的话:一切解释权归官方所有,你要用,就得遵守我制定的规范。我的规范就是不让你们混用。

这就是纯纯的耍无赖了,相当于是做了一个违背祖宗的决定。

然而这个问题似乎并没有官方人员参与讨论,直到这个时候,2018 年 3 月 27 日:

详解Lombok的坑

rspiller 就是官方人员,他说:我们正在调查此事。

此时,距离这个问题提出的时间已经过去了一年。

我是比较吃惊的,因为我认为这是一个比较严重的 BUG 了,程序员在使用的时候会遇到一些就类似于我认为这个字段一定是有默认值的,但是实际上却变成了 null 这种莫名其妙的问题。

在官方人员介入之后,这个问题再次活跃起来。

一位 xak2000 老哥也发表了自己的看法,并艾特了官方人员:

相关阅读