有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用类将导致性能下降。forName(…)在大容量应用中?

这就是我要做的。我有一个web服务,它最终调用一个简单的调度器。dispatcher从请求中为该特定类型的请求实例化一个处理程序。所有处理程序都实现相同的接口

我正在努力解决的问题是调度器实例化处理程序的最佳方式

我有两种解决方案:

  1. 使用键为场景的映射(与请求相同),值为字符串的映射来查找类

    scenarios = new HashMap<String, String>();
    scenarios.put("A", "com.xyz.handlers.ScenarioAHandler");
    

    然后这样做:

    handlerClass = Class.forName(scenarios.get(scenario));
    handler = (HandlerInterface) handlerClass.newInstance();
    
  2. 我的另一个解决方案是只使用值为的类

    scenarios = new HashMap<String, Class>();
    scenarios.put("A", ScenarioAHandler.class);
    

    然后我可以这样做来获取处理程序的实例:

    handler = (HandlerInterface) this.scenarios.get(scenario).newInstance();
    

这两个方案中有一个比另一个更好,还是有一个我还没有考虑过的更好的解决方案


共 (1) 个答案

  1. # 1 楼答案

    第二个场景的速度稍微快一点,因为它不需要执行“如果未加载此类,则加载类”代码(请参见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;
    }
    }