【编程分享】如何去覆盖lombok中使用@Builder注解生成的Builder类的ToString()方法?

【编程分享】如何去覆盖lombok中使用@Builder注解生成的Builder类的ToString()方法?

🌟 Lombok的Builder模式还能这么玩?

‌🏷️ 标签‌:#Java黑科技 #干货分享

🎁‌ 文末还准备了idea快速升级maven版本插件分享,一定要看到最后!‌

📚 正文

你有没有遇到过要覆盖生成Builder类的ToString()方法的问题呢?请问你是怎么解决的呀?可以在评论区互动留言分享哦~

小编是先问了AI, 然后在网上搜索了一通,翻了好大会儿没找到...再然后嘞,小编就开始🌚悄悄带上了痛苦🎭。

突然,小编灵光一现💡 想到了以下两种方式,并经过了实操验证~ 好开心😄

打着独乐乐不如众乐乐的精神,小编就立马梳理分享出来啦。好啦,废话不多说,开始发车~

方式一:

在定义@Builder的类里去定义对应的Builder类, 然后重写toString()方法即可(其实就是可以利用lombok可以复用类的toString()方法)

注: 类名可以在编译后通过class获取。如果是默认的话则Builder的类名为原类名加Builder (当前使用lombok版本为: 1.18.12)

typescript 复制代码
import lombok.Builder;
import lombok.Data;

@Builder
@Data
public class MyOptions {

    private String param1;
    private String param2;
    private String param3;

    @Override
    public String toString() {
        return ToStringUtils.toString(this);
    }

    /**
     * 定义Builder类的ToString方法
     */
    public static class MyOptionsBuilder {
        @Override
        public String toString() {
            return ToStringUtils.toString(this);
        }
    }

}

方式二:

CV大法~

第一步:先正常使用@Builder注解,然后进行编译,编译完成后移除当前类的@Builder注解

第二步:找到编译的class文件,复制编译生成的获取Builder类对象的builder()静态方法。

第三步:找到编译的class文件,复制编译生成的Builder类的全部内容。(可新建单独的类文件)

第四步:自行定义Builder类的ToString()方法即可

优点: 完全可控

缺点: 在模型变动时需要同步修改Builder类

基类:

typescript 复制代码
import lombok.Builder;
import lombok.Data;

@AllArgsConstructor
@Builder
@Data
public class MyOptions1 {

    private String param1;
    private String param2;
    private String param3;

    @Override
    public String toString() {
        return ToStringUtils.toString(this);
    }

}

最终完成类:

typescript 复制代码
@AllArgsConstructor
@Data
public class MyOptions2 {

    private String param1;
    private String param2;
    private String param3;

    @Override
    public String toString() {
        return ToStringUtils.toString(this);
    }


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

    public static class MyOptions2Builder {
        private String param1;
        private String param2;
        private String param3;

        MyOptions2Builder() {
        }

        public MyOptions2Builder param1(String param1) {
            this.param1 = param1;
            return this;
        }

        public MyOptions2Builder param2(String param2) {
            this.param2 = param2;
            return this;
        }

        public MyOptions2Builder param3(String param3) {
            this.param3 = param3;
            return this;
        }

        public MyOptions2 build() {
            return new MyOptions2(this.param1, this.param2, this.param3);
        }

        @Override
        public String toString() {
            return ToStringUtils.toString(this);
        }

    }

}

测试类

ruby 复制代码
import com.alibaba.fastjson2.JSON;

public class MyOptionsTest {
    public static void main(String[] args) {
        MyOptions myOptions = MyOptions.builder().param1("1").param2("2").param3("3").build();

        MyOptions2 myOptions2 = MyOptions2.builder().param1("1").param2("2").param3("3").build();

        System.out.println(JSON.toJSONString(myOptions));  //输出 {"param1":"1","param2":"2","param3":"3"}

        System.out.println(JSON.toJSONString(myOptions2)); //输出 {"param1":"1","param2":"2","param3":"3"}
    }
}

ToStringUtils

typescript 复制代码
public class ToStringUtils {

    private ToStringUtils() {

    }

    public static String toString(Object o) {
        if (o == null) {
            return null;
        }
        return o.getClass().getName() + "@" + Integer.toHexString(o.hashCode());
    }
}

插件分享

框架开发大佬、中台开发大佬快来看~ Maven快速调整项目版本再也不用手敲命令啦,小白也能快速调整!!!

🎁 关注后回复【申请试用】领取IDEA Maven快速升级插件KEY

结尾

以上就是本篇文章的全部内容啦,感谢你的阅读和观看。如果你觉得这篇文章有所帮助,欢迎"点赞"或分享给需要的小伙伴~

相关推荐
陈随易2 小时前
编程语言级别的Skill市场,AI Agent 的未来形态
前端·后端·程序员
IT_陈寒5 小时前
Vite的热更新突然不香了,排查三小时差点砸键盘
前端·人工智能·后端
子兮曰5 小时前
Agency-Agents 深度解析:400+ AI 专家的"梦之队"如何重塑开发工作流
前端·后端·vibecoding
用户8356290780516 小时前
Python 实现 PDF 文件加密与解密方法
后端·python
小满zs6 小时前
Go语言第二章(小无相功)
后端·go
用户8356290780516 小时前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
karry_k6 小时前
MyBatis批量insert-select踩坑:useGeneratedKeys=true 可能让PostgreSQL返回大量插入结果
java·后端
妙码生花6 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十九):点选验证码代码逐行目检
前端·后端·go
贰先生6 小时前
Xiuno BBS X版 用户封禁系统
后端
karry_k6 小时前
PostgreSQL 在 MyBatis 中执行正常 SQL 失效:一次 DELETE USING 踩坑记录
java·后端