如何使用Lombok替换获取嵌套对象属性的Getter方法?
用Lombok替代嵌套对象属性的手动Getter方法
嘿,我懂你的需求——不想手动写那些转发basicData内部属性的Getter方法,同时还不能替换basicData这个属性本身。Lombok刚好有几个实用方案能解决这个问题,下面给你详细讲讲:
方案一:使用@Delegate注解(推荐,完全匹配原有调用方式)
@Delegate是Lombok专门处理委托场景的注解,它能自动把嵌套对象的指定方法暴露到当前类中。为了避免把MyBasicDataClass的所有方法都委托出去(比如Builder相关方法),我们可以通过接口来限定需要暴露的Getter范围:
步骤1:定义限定暴露范围的接口
先创建一个接口,把你想从MyBasicDataClass对外暴露的Getter方法定义进去:
public interface MyBasicDataAccessor { Integer getMyInt(); Boolean getMyBool(); }
步骤2:修改原代码,添加@Delegate注解
让内部类实现刚才的接口,再给basicData属性加上@Delegate并指定委托的接口类型:
import lombok.Builder; import lombok.experimental.Delegate; public class MyClass { @Delegate(types = MyBasicDataAccessor.class) private MyBasicDataClass basicData = MyBasicDataClass.builder().myInt(10).myBool(true).build(); @Builder static class MyBasicDataClass implements MyBasicDataAccessor { private Integer myInt; private Boolean myBool; // Lombok会自动生成符合接口的Getter方法,无需手动编写 } }
这样Lombok会自动在MyClass中生成和你手动编写完全一致的getMyInt()、getMyBool()方法,内部逻辑就是返回basicData对应的属性,完美替代手动代码。
方案二:使用@Getter+@Accessors(简化版,无需额外接口)
如果你不想额外定义接口,也可以用链式访问的方式减少手动代码,只是调用方式会稍有变化:
import lombok.Builder; import lombok.Getter; import lombok.experimental.Accessors; public class MyClass { @Getter @Accessors(fluent = true) private MyBasicDataClass basicData = MyBasicDataClass.builder().myInt(10).myBool(true).build(); @Builder @Getter @Accessors(fluent = true) static class MyBasicDataClass { private Integer myInt; private Boolean myBool; } }
现在你可以通过myClass.basicData().myInt()的链式调用获取属性,虽然和原有的getMyInt()调用方式不同,但也省去了手动写转发Getter的麻烦。如果需要严格保留原有方法签名,还是方案一更合适。
两种方案都能保留basicData属性不变,同时让Lombok帮你自动生成需要的转发逻辑,不用再手动编写重复代码。
内容的提问来源于stack exchange,提问作者Wiebke
相关产品推荐
相关产品推荐

