1. 背景
项目实现一组对外接口,接口声明中有部分根据类型做不同业务的逻辑。
老系统设计时通过 if-else 判断,到最后接手维护的时候有点痛苦。
新的这一套,重新做了点设计:
- 要判断的类型 Type,设置成 enum
- 具体业务 ServiceImpl 和入口 ServiceImpl 都实现接口 Service
- 入口 ServiceImpl 自动注入所有 Type 到 对应具体业务 ServiceImpl 构成的 EnumMap
- 入口 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
的下拉菜单