java - 如何使用 Lombok 实例化具有许多对象作为字段的类?
问题描述
我有一个存储许多字段的类(原始类型和对象,如String
or 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 错误。
解决方案
如果约束 3 意味着您想要限制允许子类执行的操作(即确保它们永远不会是可变的),那么这是无法满足的,因为您无法在 Java 中对子类强制执行不变性。如果它的意思是“应该可以添加字段”,那么一切都很好。
也就是说,你应该去@SuperBuilder
上课@Getter
。使用集合而不是数组,使用@Singular
; Lombok 的 SuperBuilder 将使用不可变集合类。用于@NonNull
必填字段。为子类和序列化框架添加一个@NoArgsConstructor
。
我认为这是龙目岛最好的。你的 linter 可能仍然有警告,但至少部分是因为生成的代码对它来说太复杂了。
PS:使用当前的 Lombok edge 版本 1.18.3 或等待版本 1.18.4 以@NonNull
支持@SuperBuilder
.
推荐阅读
- c# - 如何在没有凭据的情况下在 C# 中访问 Google Drive 共享内容
- javascript - React.js 没有呈现正确的字体真棒图标
- javascript - 在 Javascript 和/或 jQuery 中,如何在包装的 div 中获取第一行文本
- documentum - 连接到文档源时出错
- javascript - 如何使用 moment.js 获得最后完成的 15 分钟?
- sql - 取消选择在此查询中不起作用
- webpack - “PageSpeed Insights”不显示外部文件?
- javascript - 过滤 ListItem 和 sap.m.List 中的格式化元素
- vba - 在 VBA 上声明和定义 FileSystemObject 对象的正确方法是什么?
- angular - 如何在其他组件中动态插入模板引用 angular 5