这就是我正在尝试做的事情。我有一个网络服务,最终调用一个简单的调度程序。调度程序根据请求实例化该特定类型请求的处理程序。所有处理程序都实现相同的接口(interface)。
我正在努力解决的问题是调度程序实例化处理程序的最佳方式。
我有两个解决方案:
使用映射,其中键为场景(与请求中的相同),值为字符串来查找类。
scenarios = new HashMap<String, String>(); scenarios.put("A", "com.xyz.handlers.ScenarioAHandler");
然后这样做:
handlerClass = Class.forName(scenarios.get(scenario)); handler = (HandlerInterface) handlerClass.newInstance();
我的另一个解决方案是仅使用该值的类。
scenarios = new HashMap<String, Class>(); scenarios.put("A", ScenarioAHandler.class);
然后我可以这样做来获取处理程序的实例:
handler = (HandlerInterface) this.scenarios.get(scenario).newInstance();
其中一个比另一个更好,还是有我尚未考虑的更好的解决方案?
最佳答案
第二种情况要快一些,因为它不必执行“如果未加载此类,则加载类”代码(请参阅 Class.java 中的 forName
方法)。但正如 Sajan Chandran 所说,工厂会更快、更安全:
public class HandlerFactory {
private HandlerFactory() {}
public static HandlerInterface getHandler(String scenario) {
HandlerInterface handler = null;
// switch is just as fast as HashMap lookup.
switch(scenario) {
case "A": handler = new ScenarioAHandler(); break;
case "B": handler = new ScenarioBHandler(); break;
default: throw new IllegalArgumentException("No handler defined for scenario " + scenario);
}
return handler;
}
}
关于java - 在大容量应用程序中使用 Class.forName(...) 是否会导致性能下降?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23762328/