You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 18:22:28