【发布时间】:2017-11-14 13:35:02
【问题描述】:
我有 2 个文件:ImplementationProvider 和 CaseHandler。
实施提供者:
class ImplementationProvider {
public void method1(Object[] params) {}
public void method2(Object[] params) {}
...
public void method100(Object[] params) {}
}
案例处理程序:
class CaseHandler {
ImplementationProvider ip; // auto injected
public void handle(String s, String param) {
switch(s) {
case USE_CASE_ONE: ip.method1(param); break;
case USE_CASE_TWO: ip.method2(param); break;
...
}
}
}
如何重构 CaseHandler 以便 USE_CASE 字符串是 HashMap 中的键,其中值将是方法?我遇到的主要问题是参数的传播。这里的其他答案建议使用接口,但是我需要在运行时提供参数。
【问题讨论】:
-
你的 100 个方法的返回类型是什么?它应该是无效的吗?
-
@Eran 它们现在都是无效的(目前想不出它们不会出现的用例)
-
您希望通过将方法放入哈希图中获得什么?绑定是否在运行时更改?我倾向于将 s 处理为有效的方法名称并使用反射,如果您必须对所有绑定进行编码,那么构建 hashmap 可能比 case 语句更难维护。
-
@PeteKirkham 减少 CaseHandler 中的代码,O(1) 搜索正确的方法。
-
您的分析是否显示这是一个瓶颈?散列一个字符串需要处理它的所有字符,然后你有一个额外的重定向级别。开关也不必这样做(取决于优化编译器的能力,但 IIRC 优化仅适用于在许多情况下的 switch 语句,因为适合 CPU 缓存的线性搜索比导致结果的散列更快错过)。如果必须设置地图,代码总量会更大。
标签: java design-patterns refactoring