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

结尾

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

相关推荐
31535669135 分钟前
Springboot实现一个接口加密
后端
Linn2 小时前
Spring WebSocket 服务实现的主流方案与最佳实践
spring boot·后端·spring
M1A12 小时前
企业信息化管理(EIM):数字化转型的核心引擎
后端
我是老孙3 小时前
Spring Boot 应用中,配置的加载优先级
spring boot·后端·pycharm
风象南3 小时前
基于 SpringBoot 的 REST API 与 RPC 调用的统一封装
java·spring boot·后端
陈随易3 小时前
Kimi k2不行?一个小技巧,大幅提高一次成型的概率
前端·后端·程序员
Victor3563 小时前
MySQL(133)如何解决MySQL连接超时问题?
后端
亚洲第一中锋_哈达迪3 小时前
详解缓存淘汰策略:LRU
后端·缓存·golang
婪苏3 小时前
Python 数据类型详解:从基础到拷贝机制
后端
icecreamstorm3 小时前
MySQL索引
后端·mysql