我有一個(gè)存儲(chǔ)許多字段的類(原始類型和對(duì)象,如Stringor List)。所有字段都是必需的,并且只需要在創(chuàng)建對(duì)象時(shí)設(shè)置一次。在確保滿足這些條件的同時(shí),使用 Lombok 實(shí)例化它的正確方法是什么:1) 由于 Setter 返回可變對(duì)象的風(fēng)險(xiǎn),沒(méi)有警告。2) 不要使用構(gòu)造函數(shù)來(lái)實(shí)例化所有字段,因?yàn)樽侄螖?shù)可以大于 10。3)能夠繼承和擴(kuò)展這個(gè)類,其中每個(gè)子類只會(huì)增加更多的字段,其他什么都不做。4) 序列化友好(即有一個(gè)空的公共構(gòu)造函數(shù))。class ParentData { int id; String name;}class ChildData extends ParentData { long childId; long[] friendId; String[] friendNames;}目前,即使我將字段設(shè)置為private final,我也會(huì)收到 findBugs 錯(cuò)誤,即[]對(duì)象是可變的。
2 回答

瀟湘沐
TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超6個(gè)贊
如果約束 3 意味著您想限制子類可以做什么(即確保它們永遠(yuǎn)不會(huì)可變),那么這是不可滿足的,因?yàn)槟鸁o(wú)法在 Java 中對(duì)子類強(qiáng)制執(zhí)行不變性。如果這意味著“應(yīng)該可以添加字段”,那么一切都很好。
這就是說(shuō),你應(yīng)該去@SuperBuilder
,并@Getter
在課程。使用帶有@Singular
; 的集合而不是數(shù)組。Lombok 的 SuperBuilder 將使用不可變的集合類。使用@NonNull
所需的字段。@NoArgsConstructor
為子類和序列化框架添加一個(gè)。
我認(rèn)為這是 Lombok 所能獲得的最好的結(jié)果。你的 linter 可能仍然會(huì)發(fā)出警告,但至少部分是因?yàn)樯傻拇a對(duì)它來(lái)說(shuō)太復(fù)雜了。
PS:使用當(dāng)前的 Lombok edge 版本 1.18.3 或等待 1.18.4 版本@NonNull
在@SuperBuilder
.
添加回答
舉報(bào)
0/150
提交
取消