假设我正在创建一个名为Government的课程。政府有会员,如官员,部长,部门等。对于每个成员,我都会创建一个界面,任何特定的政府都会根据自己的喜好对其进行定义。
政府类中的主要方法称为Serve(Request req)
。假设查询率非常大(每秒1000次查询)。
为了建立政府,我可以:
1)使用Java泛型来编写Government<Class Minister, Class Officer, ...>
,并且任何特定的政府实现都需要在java代码中创建自己的Government对象,并使用main()
来部署jar。
2)有一个配置文件,指定官员,部长等的类名,每当调用Serve()
时,它使用Class.forName()
和Class.newInstance()
创建一个对象类。任何新政府只需要为其成员和配置文件编写类。所有政府都有一个main()
。
从纯粹的表现来看 - 这更好,为什么?我主要担心的是:
a)forName()
每次执行代价高昂的搜索吗?假设有很大的类。
b)我们是否错过了可能在案例1中执行的编译器优化,但在动态类的情况2中却没有?
答案 0 :(得分:2)
只要重用您的管理对象,运行时就没有区别。差异仅在对象创建时。
1&amp; 2概念不同 - 1是硬连线,2是动态的(你甚至可以使用像春天,guice或pico这样的DI对手 - 基本上你建议你自己编写)
至于forName()性能 - 它在classloader上(也在容器上)。他们的MOst会缓存名称解析结果,在地图中查找 - 但我不能代表所有
至于优化 - 有编译器优化,以及来自JIT编译器的激进的运行时优化 - 它们更重要。
答案 1 :(得分:0)
我不明白。这两个不是替代品;它们非常正交:泛型是一个编译时构造。它被擦除,并且在运行时不会转换为任何内容。另一方面,通过调用forName
来加载类是运行时的事情。一个不影响另一个。
如果您使用泛型,那么这意味着您在运行时不需要类对象,因为在泛型中您无权访问类对象,除非您明确地传递它。如果您在运行时不需要类对象,则表示您不需要使用forName
加载它,因此与forName
不一致。如果你明确地传递了类对象,那么这意味着你已经拥有了类对象而不需要加载它,也与forName
不一致。
答案 2 :(得分:0)
你的描述对我来说是这样的:“我想使用依赖注入,我应该自己动手吗?”
关注Spring(或Google的Guice)。我会假设春天。
为stuff创建接口并配置在Spring中为每个实现使用的实现。