首页 > 解决方案 > 如何使用 Lombok 实例化具有许多对象作为字段的类?

问题描述

我有一个存储许多字段的类(原始类型和对象,如Stringor List)。所有字段都是必需的,并且只需要在创建对象时设置一次。

在确保满足这些条件的同时,使用 Lombok 实例化它的正确方法是什么:

1) 由于设置器返回可变对象的风险,没有警告。

2) 不要使用构造函数来实例化所有字段,因为字段数可以大于 10。

3)能够继承和扩展这个类,每个子类只会增加更多的字段,其他什么都不做。

4) 对序列化友好(即,有一个空的公共构造函数)。

class ParentData {
    int id;
    String name;
}

class ChildData extends ParentData {
    long childId;
    long[] friendId;
    String[] friendNames;
}

目前,即使我将字段设置为private final,我也会收到[]对象是可变的 findBugs 错误。

标签: javaoopfinallombok

解决方案


如果约束 3 意味着您想要限制允许子类执行的操作(即确保它们永远不会是可变的),那么这是无法满足的,因为您无法在 Java 中对子类强制执行不变性。如果它的意思是“应该可以添加字段”,那么一切都很好。

也就是说,你应该去@SuperBuilder上课@Getter。使用集合而不是数组,使用@Singular; Lombok 的 SuperBuilder 将使用不可变集合类。用于@NonNull必填字段。为子类和序列化框架添加一个@NoArgsConstructor

我认为这是龙目岛最好的。你的 linter 可能仍然有警告,但至少部分是因为生成的代码对它来说太复杂了。

PS:使用当前的 Lombok edge 版本 1.18.3 或等待版本 1.18.4 以@NonNull支持@SuperBuilder.


推荐阅读