Java 在大容量应用程序中使用Class.forName(…)会影响性能吗?
这就是我要做的。我有一个web服务,它最终调用一个简单的调度器。dispatcher从请求中为该特定类型的请求实例化一个处理程序。所有处理程序都实现相同的接口 我正在努力解决的问题是调度器实例化处理程序的最佳方式 我有两种解决方案:Java 在大容量应用程序中使用Class.forName(…)会影响性能吗?,java,Java,这就是我要做的。我有一个web服务,它最终调用一个简单的调度器。dispatcher从请求中为该特定类型的请求实例化一个处理程序。所有处理程序都实现相同的接口 我正在努力解决的问题是调度器实例化处理程序的最佳方式 我有两种解决方案: 使用键为场景的映射(与请求相同),值为字符串的映射来查找类 scenarios = new HashMap<String, String>(); scenarios.put("A", "com.xyz.handlers.ScenarioAHandler"
scenarios = new HashMap<String, String>();
scenarios.put("A", "com.xyz.handlers.ScenarioAHandler");
scenarios = new HashMap<String, Class>();
scenarios.put("A", ScenarioAHandler.class);
这两种方法中的任何一种都比另一种好,还是有更好的解决方案我还没有考虑过?第二种方案速度稍快,因为它不必经过“如果未加载此类,则加载类”代码(请参阅中的
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;
}
}
我想到的是约定而不是配置——但不能保证它能工作。代替选项1,您可以从类似字符串classname=“com.xyz.handlers.scenario”+scenario+“Handler”的场景中派生类名。我不知道这个场景有什么命名约定,如果它可能包含冲突字符,那么这个解决方案是不好的。我不认为你会注意到任何真正的区别,无论你做什么选择,但只有一种方法可以确定:测量它!您可以重用处理程序实例吗?可能您应该使用
工厂模式
为每个请求
创建处理程序
,只需在工厂类
@Jukka中使用新的handlerType
,处理程序“可以”从一个调用重用到下一个调用,但不会被重用(重新实例化)在对服务的单个调用中。如果可以重用实例,则只需预先实例化所有处理程序并将它们放置在映射中。因此我理解更安全的部分,但是什么让这更快?new Object()
比Object.class.newInstance()快一点
我自己很难找到答案,但是java中的一个开关会从上到下测试每种情况吗?
handler = (HandlerInterface) this.scenarios.get(scenario).newInstance();
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;
}
}