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

相关推荐
亚马逊云开发者4 分钟前
智能化 Graviton 迁移:Amazon Q CLI 加速应用架构现代化
java·人工智能
风象南12 分钟前
Spring Boot 的 3 种二级缓存落地方式
java·spring boot·后端
皮皮林55113 小时前
使用 Java + WebSocket 实现简单实时双人协同 pk 答题
java·websocket
码小凡14 小时前
优雅!用了这两款插件,我成了整个公司代码写得最规范的码农
java·后端
掉鱼的猫16 小时前
Solon AI 五步构建 RAG 服务:2025 最新 AI + 向量数据库实战
java·redis·后端
java金融16 小时前
FactoryBean 和BeanFactory的傻傻的总是分不清?
java·后端
独立开阀者_FwtCoder16 小时前
Nginx 通过匹配 Cookie 将请求定向到特定服务器
java·vue.js·后端
名曰大神16 小时前
AEM6.5集成Redis详细步骤(附代码)
java·redis·demo·aem
带刺的坐椅17 小时前
Solon AI 五步构建 RAG 服务:2025 最新 AI + 向量数据库实战
java·redis·ai·solon·rag
东阳马生架构17 小时前
商品中心—7.自研缓存框架的技术文档
java