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

结尾

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

相关推荐
00后程序员13 小时前
iOS 上架 4.3,重复 App 审核条款的真实逻辑与团队应对策略研究
后端
00后程序员13 小时前
专业的 IPA 处理工具 构建可维护、可回滚的 iOS 成品加工与加固流水线
后端
百度Geek说13 小时前
项目级效能提升一站式交付最佳实践
后端
今天你TLE了吗13 小时前
通过RocketMQ延时消息实现优惠券等业务MySQL当中定时自动过期
java·spring boot·后端·学习·rocketmq
Gundy13 小时前
构建一个真正好用的简单搜索引擎
后端
疯狂的程序猴13 小时前
构建面向复杂场景的 iOS 应用测试体系 多工具协同下的高质量交付实践
后端
大巨头13 小时前
C# 中如何理解泛型
后端
用户9924410315613 小时前
TRAE SOLO实战录:AI应用可观测性与风险管控的破局之道
后端
Dr丶net13 小时前
🔥NestJS 接口文档神器!nestjs-knife4j-plus 让 Swagger 颜值与功能双飞跃
后端
我家领养了个白胖胖14 小时前
arthas 我愿称为最强辅助工具
java·后端