使用Lombok toBuilder实现嵌套类深拷贝,有无更简洁方案?
实体类定义
@Data @AllArgsConstructor @NoArgsConstructor @Builder(toBuilder = true) public class Example { public ExampleTwo exampleTwo; @lombok.Data @AllArgsConstructor @NoArgsConstructor @Builder(toBuilder = true) public static class ExampleTwo { private SomeData someData; private AnotherField anotherField; } } @Data @AllArgsConstructor @NoArgsConstructor @Builder(toBuilder = true) public class SomeData { private String specialId; private String firstName; private String lastName; }
问题场景
已获取一个Example实例并通过深拷贝生成副本,需要修改副本中嵌套类SomeData的specialId字段,当前实现需要多步创建中间对象,希望得到更简洁易读的实现,且避免使用Serializable、Cloneable,第三方库作为最后选择。
简洁实现方案
方案1:链式嵌套调用toBuilder
无需创建中间变量,直接通过嵌套的toBuilder调用完成修改,代码更紧凑:
Example duplicateExample = example.toBuilder() .exampleTwo(example.getExampleTwo().toBuilder() .someData(example.getExampleTwo().getSomeData().toBuilder() .specialId("SPE_1") .build()) .build()) .build();
这种写法完全基于Lombok自带的toBuilder功能,没有引入额外依赖,逻辑连贯,可读性也较好。
方案2:在实体类中封装便捷修改方法
如果需要频繁修改这个字段,可以在Example类中封装一个专用的修改方法,把嵌套修改的逻辑隐藏起来,外部调用更简洁:
@Data @AllArgsConstructor @NoArgsConstructor @Builder(toBuilder = true) public class Example { public ExampleTwo exampleTwo; // 添加便捷修改方法 public Example withSpecialId(String newSpecialId) { return this.toBuilder() .exampleTwo(this.exampleTwo.toBuilder() .someData(this.exampleTwo.getSomeData().toBuilder() .specialId(newSpecialId) .build()) .build()) .build(); } // 内部类定义不变 @lombok.Data @AllArgsConstructor @NoArgsConstructor @Builder(toBuilder = true) public static class ExampleTwo { private SomeData someData; private AnotherField anotherField; } }
之后只需一行代码即可完成修改:
Example duplicateExample = example.withSpecialId("SPE_1");
这种方式把复杂的嵌套修改逻辑封装在实体类内部,外部调用更直观,也符合封装的设计原则。
内容的提问来源于stack exchange,提问作者Sophie
相关产品推荐
相关产品推荐

