4

假设我正在制作一个名为 Government 的课程。政府有官员、部长、部门等成员。我为每个成员创建一个界面,任何特定的政府都可以根据自己的喜好定义它们。

政府类中的主要方法被调用Serve(Request req)。假设查询率非常大(每秒 1000+ 次查询)。

要创建政府,我可以:
1)使用 Java 泛型编写Government<Class Minister, Class Officer, ...>,任何特定的政府实现都需要在 java 代码中创建自己的政府对象,并main()具有可部署的 jar。

2) 有一个配置文件,指定官员、部长等的类名,每当Serve()调用时,它使用Class.forName()Class.newInstance()创建类的对象。任何新政府只需要为其成员编写类和配置文件。main()所有政府都有一个单一的。

从纯粹的性能角度来看 - 哪个更好,为什么?我主要担心的是:

a) 是否forName()每次都执行昂贵的搜索?假设一个非常大的类域。

b) 我们是否错过了可能在案例 1 中执行的编译器优化,但在动态类上没有在案例 2 中执行?

4

3 回答 3

2

只要你重用你的government对象,在运行时就没有区别。差异仅在对象创建时。

1 和 2 在概念上有所不同 - 1 是硬连线的,而 2 是动态的(你甚至可以使用像 spring、guice 或 pico 这样的 DI 约束器 - 基本上你建议自己编写)

至于 forName() 性能 - 它取决于类加载器(以及容器)。他们中的大多数会缓存名称解析结果,在地图中查找 - 但我不能代表所有人

至于优化——有编译器优化,还有来自 JIT 编译器的积极的运行时优化——它们更重要。

于 2011-12-15T13:18:49.500 回答
0

我不明白。这两个不是替代品。它们几乎是正交的:泛型是一个编译时构造。它被擦除并且在运行时不会转换为任何内容。另一方面,通过调用加载类forName是运行时的事情。一个不影响另一个。

如果您使用泛型,那么这意味着您在运行时不需要类对象,因为在泛型中您无权访问类对象,除非您显式传递它。如果您在运行时不需要类对象,则意味着您不需要使用 加载它forName,因此与forName. 如果您确实显式传递了类对象,那么这意味着您已经有了类对象并且不需要加载它,也与forName.

于 2011-12-15T22:40:16.767 回答
0

你的描述对我来说是这样的:“我想使用依赖注入,我应该自己动手吗?”

查看 Spring(或 Google 的 Guice)。我会假设春天。

为东西创建接口并配置在 Spring 中为每个接口使用哪个实现。

于 2011-12-15T22:52:56.837 回答