buguge - Keep it simple,stupid

知识就是力量,但更重要的,是运用知识的能力why buguge?

导航

利用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;
    }
}
View Code

每个枚举都写这么2个方法,意义也只能是体现在我们的工作量了。再者,细观我们的枚举,就拿getBeanByCode来说吧,有的叫getBeanByCode,有的叫getEnumByCode,有的叫getBean,并不统一。

如果注意到这个问题的话,自然会想到神一般的lombok,给我们便利的同时,也达到了统一的标准。

自动化是建立在标准化的基础上的。我们缺乏的正是标准化。

 

是的,现在,不用再手动写这样的getBeanByCode、getDescriptionByCode方法了

党的二十大期间,我也做了点事。研究了一下lombok,自己写了个插件工具。

现在如何搞?→→→→→两步搞定。

  1. 【工具依赖】我们的基础包zhenghe-rpcapistyle已经加上对enumgen工具的依赖了。我们要做的,就是像使用lombok的@Data等一样,在需要的枚举上加注解@EnumGetByCode~~~~~~~敲黑板,前提是:你的枚举类得有getCode方法(当然有了,我们的枚举都实现了EnumAbility接口)。
  2. 【插件安装】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

posted on 2023-03-09 13:39  buguge  阅读(128)  评论(0编辑  收藏  举报