java - 在大容量应用程序中使用 Class.forName(...) 是否会导致性能下降?

标签 java

这就是我正在尝试做的事情。我有一个网络服务,最终调用一个简单的调度程序。调度程序根据请求实例化该特定类型请求的处理程序。所有处理程序都实现相同的接口(interface)。

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

我有两个解决方案:

  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();
    

其中一个比另一个更好,还是有我尚未考虑的更好的解决方案?

最佳答案

第二种情况要快一些,因为它不必执行“如果未加载此类,则加载类”代码(请参阅 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/

相关文章:

java - Keycloak:检索所有可用的客户端 session

java - Struts 2 Spring Framework 上的常规 HTML 页面

java - 即使抛出异常,如何迭代流?

java - 在 jdbc url 中设置用户变量

java - 如何使用带有回调的 send() 方法返回元数据?

java - 目标窗口已因未知错误 : web view not found 关闭

java - 在java中存储矩阵并比较它们

java - 具有多个接受答案的 JUnit 测试

java.lang.ClassNotFoundException 错误

java - Android onPause() 在 onStop() 之后调用