利用Javac AST增强枚举功能
先就lombok开始本文
lombok想必大家都在使用。
lombok我们怎么用?——两步
Step1:程序添加lombok工具包的依赖。
Step2:IDE安装lombok插件。
就是说,我们需要两个东西:lombok工具(包) & lombok插件
lombok实现原理
1)lombok工具包
2)lombok插件
我要做的,就是模仿lombok,为我们的项目中的枚举类解决重复代码量的工具。————enumgen
为了提高代码可读性和可维护性,我司应用采用了大量的枚举,来实现诸如订单状态、客户类型、合同签署方、服务商类型等数据的业务处理。
几乎在每个枚举类中,都存在2个static方法:getBeanByCode 和 getDescriptionByCode。
贴个代码更直观:
/** * 描述:渠道商业务类型 */ @Getter @AllArgsConstructor public enum AgentBizTypeEnum implements EnumAbility<String> { SAAS("SAAS业务"), SHARE_SERVICES("共享服务"), SIDE_GIFTS("身边有礼"); private String value; @Override public String getCode() { return this.toString(); } @Override public String getDescription() { return this.value; } public static AgentBizTypeEnum getBeanByCode(String code) { AgentBizTypeEnum[] statusEnums = AgentBizTypeEnum.values(); for (AgentBizTypeEnum v : statusEnums) { if (v.getCode().equals(code)) { return v; } } return null; } public static String getDescriptionByCode(String name) { AgentBizTypeEnum anEnum = getBeanByCode(name); if (anEnum != null) return anEnum.getDescription(); return null; } }
每个枚举都写这么2个方法,意义也只能是体现在我们的工作量了。再者,细观我们的枚举,就拿getBeanByCode来说吧,有的叫getBeanByCode,有的叫getEnumByCode,有的叫getBean,并不统一。
如果注意到这个问题的话,自然会想到神一般的lombok,给我们便利的同时,也达到了统一的标准。
自动化是建立在标准化的基础上的。我们缺乏的正是标准化。
是的,现在,不用再手动写这样的getBeanByCode、getDescriptionByCode方法了
党的二十大期间,我也做了点事。研究了一下lombok,自己写了个插件工具。
现在如何搞?→→→→→两步搞定。
- 【工具依赖】我们的基础包zhenghe-rpcapistyle已经加上对enumgen工具的依赖了。我们要做的,就是像使用lombok的@Data等一样,在需要的枚举上加注解@EnumGetByCode~~~~~~~敲黑板,前提是:你的枚举类得有getCode方法(当然有了,我们的枚举都实现了EnumAbility接口)。
- 【插件安装】IDE添加插件-enumgen-intellij,菜单:File→Settings→Plugins
1)enumgen工具包开发
1.1)创建一个maven项目。添加依赖 com.google.auto.service:auto-service、com.google.auto:auto-common、com.sun:tools
1.2)定义自己的注解 EnumGetByCode
1.3)定义注解处理器 EnumGetByCodeProcessor
-如何测试工具包?
-我是这么测试的。在src/test/java里创建枚举类,Rebuild项目时,会自动生成增强方法。在Rebuild过程中,如果有误,IDE会报错的,你解决就好了。
项目结构截图↓↓↓
2)enumgen插件开发
2.1)在IDEA中新建插件项目。
2.2)定义自己的PSI EnumgenAugmentProvider
2.3)plugin.xml中extensions声明
-如何测试插件?
-IDE菜单:Build→Prepare Plugin Module 'enumgen-intellij-plugin' For Deployment 。 然后,在资源目录里生成enumgen-intellij-plugin.jar, 重新在IDE中安装插件,观察你的依赖了enumgen工具的项目。
(BTW,把插件enumgen-intellij-plugin.jar直接拖到IDE中,会自动安装并弹窗提示你restart idea)
工程截图↓↓↓↓
效果
完
曾经的曾经,对lombok处于懵懂的认知状态→→大家都用lombok吧?其实,就拿@Slf4j来说,我一直不明白这个log对象是在哪里声明的开发过程中,在StackOverflow上的请求贴:https://stackoverflow.com/questions/75635082/how-to-use-ast-to-generate-a-method-for-enum-classes
当看到一些不好的代码时,会发现我还算优秀;当看到优秀的代码时,也才意识到持续学习的重要!--buguge
本文来自博客园,转载请注明原文链接:https://www.cnblogs.com/buguge/p/17198071.html