很多人看到标题可能会想到 lombok 的 @Builder,lombok 在国内用的挺多的,开源的组件中 mybatis-plus 中用到了这个,使用这个有一个问题就是通过对应 get 和 set 方法找不到对应的赋值方法,因为 lombok 使用了 apt 在编译期生成了相关的字节码。这样对于喜欢看源码的人来说很不好,起码我在看国外开源的代码时没有看到过使用 lombok 的。
在工作期间就想到了一点,idea 中有没有那种相关生成 Builder 代码的插件?
经过多次尝试,发现了一个名为 innerbuilder 的插件可以做到和 lombok 生成的代码一致。
InnerBuilder - IntelliJ IDEs Plugin | Marketplace
如下代码为例
public class SceneProductRelaInfo {
/**
* 场景信息
*/
private SysnSceneProductInfo sysnSceneProductInfo;
/**
* 场景关联商品信息
*/
private List<WarePortal> productInfoList;
public SysnSceneProductInfo getSysnSceneProductInfo() {
return sysnSceneProductInfo;
}
public void setSysnSceneProductInfo(SysnSceneProductInfo sysnSceneProductInfo) {
this.sysnSceneProductInfo = sysnSceneProductInfo;
}
public List<WarePortal> getProductInfoList() {
return productInfoList;
}
public void setProductInfoList(List<WarePortal> productInfoList) {
this.productInfoList = productInfoList;
}
}
在 idea->Settings->Plugins 中搜索 innerbuilder 进行安装
代码右键 Generate
按照如下处理即可
public class SceneProductRelaInfo {
/**
* 场景信息
*/
private SysnSceneProductInfo sysnSceneProductInfo;
/**
* 场景关联商品信息
*/
private List<WarePortal> productInfoList;
private SceneProductRelaInfo(Builder builder) {
setSysnSceneProductInfo(builder.sysnSceneProductInfo);
setProductInfoList(builder.productInfoList);
}
public SysnSceneProductInfo getSysnSceneProductInfo() {
return sysnSceneProductInfo;
}
public void setSysnSceneProductInfo(SysnSceneProductInfo sysnSceneProductInfo) {
this.sysnSceneProductInfo = sysnSceneProductInfo;
}
public List<WarePortal> getProductInfoList() {
return productInfoList;
}
public void setProductInfoList(List<WarePortal> productInfoList) {
this.productInfoList = productInfoList;
}
public static final class Builder {
private SysnSceneProductInfo sysnSceneProductInfo;
private List<WarePortal> productInfoList;
private Builder() {
}
public static Builder builder() {
return new Builder();
}
public Builder sysnSceneProductInfo(SysnSceneProductInfo val) {
sysnSceneProductInfo = val;
return this;
}
public Builder productInfoList(List<WarePortal> val) {
productInfoList = val;
return this;
}
public SceneProductRelaInfo build() {
return new SceneProductRelaInfo(this);
}
}
}
最终生成出来的代码和 lombok 的一致。
SceneProductRelaInfo build = SceneProductRelaInfo.builder().productInfoList(null).sysnSceneProductInfo(null).build();
上面的代码逻辑在使用 @Builder 注解和生成的代码中切换,没有异常。
lombok 原理
https://blog.csdn.net/ly279481968/article/details/108000799
https://www.jianshu.com/p/302c56f9574d
https://zhuanlan.zhihu.com/p/485004057
https://zhuanlan.zhihu.com/p/574760548