【编程分享】如何去覆盖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
结尾
以上就是本篇文章的全部内容啦,感谢你的阅读和观看。如果你觉得这篇文章有所帮助,欢迎"点赞"或分享给需要的小伙伴~