idea中java类属性(字段)链式赋值

很多人看到标题可能会想到 lombok 的 @Builder,lombok 在国内用的挺多的,开源的组件中 mybatis-plus 中用到了这个,使用这个有一个问题就是通过对应 get 和 set 方法找不到对应的赋值方法,因为 lombok 使用了 apt 在编译期生成了相关的字节码。这样对于喜欢看源码的人来说很不好,起码我在看国外开源的代码时没有看到过使用 lombok 的。

在工作期间就想到了一点,idea 中有没有那种相关生成 Builder 代码的插件?

经过多次尝试,发现了一个名为 innerbuilder 的插件可以做到和 lombok 生成的代码一致。

InnerBuilder - IntelliJ IDEs Plugin | Marketplace

如下代码为例

java 复制代码
public class SceneProductRelaInfo {

    /**
     * 场景信息
     */
    private SysnSceneProductInfo sysnSceneProductInfo;

    /**
     * 场景关联商品信息
     */
    private List<WarePortal> productInfoList;

    public SysnSceneProductInfo getSysnSceneProductInfo() {
        return sysnSceneProductInfo;
    }

    public void setSysnSceneProductInfo(SysnSceneProductInfo sysnSceneProductInfo) {
        this.sysnSceneProductInfo = sysnSceneProductInfo;
    }

    public List<WarePortal> getProductInfoList() {
        return productInfoList;
    }

    public void setProductInfoList(List<WarePortal> productInfoList) {
        this.productInfoList = productInfoList;
    }


}

在 idea->Settings->Plugins 中搜索 innerbuilder 进行安装

代码右键 Generate

按照如下处理即可

java 复制代码
public class SceneProductRelaInfo {

    /**
     * 场景信息
     */
    private SysnSceneProductInfo sysnSceneProductInfo;

    /**
     * 场景关联商品信息
     */
    private List<WarePortal> productInfoList;

    private SceneProductRelaInfo(Builder builder) {
        setSysnSceneProductInfo(builder.sysnSceneProductInfo);
        setProductInfoList(builder.productInfoList);
    }

    public SysnSceneProductInfo getSysnSceneProductInfo() {
        return sysnSceneProductInfo;
    }

    public void setSysnSceneProductInfo(SysnSceneProductInfo sysnSceneProductInfo) {
        this.sysnSceneProductInfo = sysnSceneProductInfo;
    }

    public List<WarePortal> getProductInfoList() {
        return productInfoList;
    }

    public void setProductInfoList(List<WarePortal> productInfoList) {
        this.productInfoList = productInfoList;
    }


    public static final class Builder {
        private SysnSceneProductInfo sysnSceneProductInfo;
        private List<WarePortal> productInfoList;

        private Builder() {
        }

        public static Builder builder() {
            return new Builder();
        }

        public Builder sysnSceneProductInfo(SysnSceneProductInfo val) {
            sysnSceneProductInfo = val;
            return this;
        }

        public Builder productInfoList(List<WarePortal> val) {
            productInfoList = val;
            return this;
        }

        public SceneProductRelaInfo build() {
            return new SceneProductRelaInfo(this);
        }
    }
}

最终生成出来的代码和 lombok 的一致。

java 复制代码
SceneProductRelaInfo build = SceneProductRelaInfo.builder().productInfoList(null).sysnSceneProductInfo(null).build();

上面的代码逻辑在使用 @Builder 注解和生成的代码中切换,没有异常。

lombok 原理

https://blog.csdn.net/ly279481968/article/details/108000799

https://www.jianshu.com/p/302c56f9574d

https://zhuanlan.zhihu.com/p/485004057

https://zhuanlan.zhihu.com/p/574760548

相关推荐
功德+n7 分钟前
Apache POI详解
java·开发语言·maven·apache
即兴小索奇32 分钟前
PyCharm 接入 DeepSeek、OpenAI、Gemini、Mistral等大模型完整版教程(通用)!
ide·python·pycharm
Kale又菜又爱玩38 分钟前
Zookeeper实践指南
java·分布式·zookeeper
@Dai1 小时前
【Python】为什么要写__init__.py
android·java·python
WeiLai11123 小时前
面试基础--Redis 缓存穿透、缓存击穿、缓存雪崩深度解析
java·redis·分布式·后端·缓存·面试·架构
zctel3 小时前
java中小型公司面试预习资料(二):Redis
java·redis·面试
爱吃烤鸡翅的酸菜鱼4 小时前
Java【网络原理】(3)网络编程续
java·运维·服务器·网络
╰つ゛木槿7 小时前
Spring Boot 调用DeepSeek API的详细教程
java·spring boot·后端·deepseek
hhw1991128 小时前
c#面试题整理6
java·开发语言·c#
程序视点9 小时前
SpringBoot配置入门
java·spring boot·spring