Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在大容量应用程序中使用Class.forName(…)会影响性能吗?_Java - Fatal编程技术网

Java 在大容量应用程序中使用Class.forName(…)会影响性能吗?

Java 在大容量应用程序中使用Class.forName(…)会影响性能吗?,java,Java,这就是我要做的。我有一个web服务,它最终调用一个简单的调度器。dispatcher从请求中为该特定类型的请求实例化一个处理程序。所有处理程序都实现相同的接口 我正在努力解决的问题是调度器实例化处理程序的最佳方式 我有两种解决方案: 使用键为场景的映射(与请求相同),值为字符串的映射来查找类 scenarios = new HashMap<String, String>(); scenarios.put("A", "com.xyz.handlers.ScenarioAHandler"

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

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

我有两种解决方案:

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

    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;
    }
    }