我有一个存储许多字段的类(原始类型和对象,例如String
或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错误,表明[]
对象是可变的。
答案 0 :(得分:0)
也许您可以看看Builder in lombok
答案 1 :(得分:0)
如果约束3意味着您要限制允许子类执行的操作(即,确保它们永远不会可变),则这是无法满足的,因为您无法在Java中对子类强制实施不变性。如果它表示“应该可以添加字段”,那么一切都很好。
也就是说,您应该在课程上同时使用@SuperBuilder
和@Getter
。代替数组,使用带有@Singular
的集合;龙目岛的SuperBuilder随后将使用不可变的集合类。
在必填字段上使用@NonNull
。
为子类和序列化框架添加@NoArgsConstructor
。
我认为这是龙目岛最好的选择。您的linter可能仍然会发出警告,但至少部分是因为所生成的代码对其而言太复杂了。
PS:使用当前的Lombok Edge版本1.18.3或等待{8.4}的1.18.4发行,以支持@NonNull
中的@SuperBuilder
。