【编程分享】如何去覆盖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

结尾

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

相关推荐
步行cgn10 小时前
YAML 的语法规则
spring boot·后端
骇客野人11 小时前
SpringBoot电商系统用户注册、登录、留存及数据埋点设计与落地实施方案
java·spring boot·后端
IT_陈寒14 小时前
React的状态更新坑得我差点加班到天亮
前端·人工智能·后端
码事漫谈15 小时前
一天搭出 80% 的 Agent,然后卡在 95% 到死
后端
leonkay15 小时前
C# 锁机制——【2】深入原理
开发语言·后端·spring·c#·个人开发
江湖十年15 小时前
在 Go 中使用 dyno 包处理动态对象
后端·面试·go
八角丶15 小时前
Node 网络编程 —— TLS 模块
javascript·后端·node.js
山岚的运维笔记15 小时前
mysql 专业笔记 -- 第 8 章:使用变量
运维·数据库·笔记·后端·学习·mysql·dba
平头哥AI17 小时前
Day 01 | go run 跑通第一个 Go 程序,go build 留下一个能拷走的 exe
开发语言·后端·golang
ZGG00318 小时前
线程池详解:从 7 大参数到生产避坑
java·数据库·后端