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

相关推荐
paopaokaka_luck2 分钟前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
2301_322414280418 分钟前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis
考虑考虑1 小时前
JDK26的JEP 500属性
java·后端·java ee
LMT流氓兔1 小时前
第五单元——第十二课:把脚本整理成项目
java·数据库·python·langchain·1024程序员节
yuniko-n1 小时前
【JUC】四种内存屏障示例
java·1024程序员节
念何架构之路3 小时前
Go reflect 包:结构体反射 —Field、Tag 与 VisibleFields
java·数据库·golang
liangbo73 小时前
03-JDK 10/11 局部变量推断与 LTS:var 到底该怎么用
java
Percep_gan4 小时前
调用天翼云的对象存储ZOS,很详细
java·1024程序员节
若亦_4 小时前
数据结构>>优先级队列(堆)
java·数据结构
Wang's Blog4 小时前
Java 项目实战: 交友项目 - 查询圈子个人动态:查询我的动态需求分析
java·开发语言·交友