1. 背景

项目实现一组对外接口,接口声明中有部分根据类型做不同业务的逻辑。

老系统设计时通过 if-else 判断,到最后接手维护的时候有点痛苦。

新的这一套,重新做了点设计:

  1. 要判断的类型 Type,设置成 enum
  2. 具体业务 ServiceImpl 和入口 ServiceImpl 都实现接口 Service
  3. 入口 ServiceImpl 自动注入所有 Type 到 对应具体业务 ServiceImpl 构成的 EnumMap
  4. 入口 ServiceImpl 根据请求中的 Type,从 EnumMap 获取对应的具体业务 ServiceImpl,然后将请求传递给该 ServiceImpl

2. EnumMap

这个类型的 Map 底层是构造了一个枚举类型值个数长度的数组,然后数组下标就是对应的枚举值的序号(((Enum<?>)key).ordinal()

这么设计在取数据时自然是比 HashMap 效率高,对比下 HashMap 的内存结构就理解了。

3. 其他

关于 enum 的进阶用法,其实看看 java.util.concurrent.TimeUnit 的源码就差不多了。

4. 更多应用

4.1. 类型判断

做通用工具时,判断一个对象类型是不是枚举:T.class.isEnum()

案例:我用来动态判断一个对象 Field 的声明是不是枚举类型,如果是,这个 Field 在表单上动态表示为下拉菜单

4.2. 根据枚举类型的Class获取枚举所有值

做通用工具时,动态获取所有枚举值:EnumSet.allOf(T.class)

案例:我用来动态生成过 org.springframework.http.HttpMethod 的下拉菜单