gpt4 book ai didi

java - Servlet 和命令模式,编译还是运行时?

转载 作者:行者123 更新时间:2023-11-29 07:16:29 26 4
gpt4 key购买 nike

我正在编写一个充当前端 Controller 的 Java servlet。为了执行功能,我使用域命令模式。目前,我正在初始化我的所有命令并将它们存储在一个映射中,其中命令的名称(字符串)作为键,对象作为值。每当 servlet 收到请求时,我都会通过从 url 传递命令查询来从 map 获取命令:

// at init
Hashmap<String, DomainCommand> commands = new Hashmap<String, DomainCommand>();
commands.put("someCommand", new SomeCommand());

// at request
String command = request.getParameter("command");
DomainCommand c = commands.get(command);
c.execute();

由于我的 DomainCommand 没有要在线程之间共享的类属性,因此效果很好并且可以满足我的要求。另一种方法是使用反射来创建对象,如下所示:

String command = request.getParameter("command");
DomainCommand c = Class.forName(command).newInstance(); // assuming in same (default) package
c.execute();

这两个都有效。从性能/内存节省的角度来看哪个更好?

最佳答案

性能

使用 Map 时,唯一的成本是访问 HashMap(可忽略不计)。另一方面,反射可能会花费更多时间并且不太安全 - 请记住,您必须确保用户没有传递虚假的 command,从而允许他运行任意代码。

内存

当在启动时创建 DomainCommand 时,它们将在一段时间后在老年代结束,因此大部分时间都不会受到垃圾收集的影响。另一方面,当每个请求创建时,它们很可能会立即被垃圾收集。所以总的来说,内存占用量是相当的,除了第二种方法需要更多的 GC 运行。

总而言之,命令映射是一种更好的方法。顺便说一句,如果您使用像 Spring 或 Guice 这样的 DI 框架(除非这对您来说太过分了)或像 Struts/Spring MVC 这样的 Web 框架,它们将为您完成完全相同的工作。

关于java - Servlet 和命令模式,编译还是运行时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9157264/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com