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

相关推荐
摇滚侠18 小时前
《SpringBoot 3:入门与应用实战》第 5 章 使用 Spring Boot 阅读笔记 9
java·spring boot·笔记
进阶的小名18 小时前
Spring AI 2.0 探索:多 OpenAI-Compatible 模型接入,以及下一代 Session 记忆管理
java·人工智能·后端·gpt·spring·ai·chatgpt
yaoxin52112319 小时前
503. Java 反射 - 编写 ServiceFactory 类
java·开发语言·python
考虑考虑19 小时前
Java三元表达式注意
java·后端·java ee
程序员小八77719 小时前
Java 快速转 Go
java·python·golang
职场的momo20 小时前
11个后端与AI岗位同时开放:Java、网关、推理优化怎么匹配
java·开发语言·人工智能
罗超驿20 小时前
SpringMVC 请求参数接收详解|单个参数、多参数、对象参数、@RequestParam参数重命名
java·后端·postman·javaee
古法安卓21 小时前
Android-epoll原理详解
android·java·android studio
fireworks9921 小时前
接口鉴权(401与403)
java·后端
wear工程师21 小时前
线程池里的异常去哪了?execute 和 submit 不是一回事
java