当给定例程名称时,我有大约30个处理程序例程以String形式分派。
因此,在工厂方法中,调度例程的一种自然方式是使用一系列if...else
来比较常规名称以适合插槽。它起作用,但毫无疑问,随着惯例数量的增加,它是笨拙和低效的。
我想出了一个使用枚举和EnumMap的方式:每当我添加一个例程时,我都会添加一个枚举实例,并在EnumMap中注册它(例程名称和例程类作为键和值)。
据我所知,当实例数小于 64(长类型长度)时,EnumMap实现使用long
作为位数组并使用位偏移来执行put
和get
,所以它非常快,只要常规数量少,我就可以在调度例程时获得O(1)性能超过64(非常适合我的情况)。
但是, EnumMap 的限制是其key type
只能是Enum
,而不是String
,
我无法使用例程名称(string
)来快速查找....
有什么方法可以解决这个问题吗? 或者,如果我只能使用键的值进行反向查找:)
答案 0 :(得分:2)
我会保持简单,只需使用HashMap<String, Handler>
,直到你可以证明这是一个严重的瓶颈。我在这里假设你的所有处理程序都有一个共同的超类或接口,所以你可以这样做
handlers.get(name).handle(...);
如果您从String键开始,EnumMap将不会更快,因为您首先必须使用valueOf
来获取与该字符串对应的枚举值,并且this is itself implemented as a lookup in a HashMap ... < / p>