假设我正在创建一个名为Government的类。政府有官员、部长、部门等成员。我为每一个成员创建了一个接口,任何特定的政府都可以根据自己的喜好来定义它们。
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中执行动态类?
只要重用政府对象,在运行时就没有区别。区别只存在于对象创建时。
1,2在概念上不同——1是硬连接的,而2是动态的(你甚至可以使用像spring, guice或pico这样的DI容器——基本上你建议自己编写)
至于forName()的性能-它在类加载器上(也在容器上)。它们中的大多数会缓存名称解析结果,在map中查找-但我不能说所有
至于优化——有编译器优化,也有JIT编译器的积极运行时优化——它们更重要。
我不明白。这两者不是替代品;它们几乎是正交的:泛型是编译时构造。它将被擦除,并且不会在运行时转换为任何内容。另一方面,通过调用forName
来加载类是运行时的事情。一个不影响另一个
如果你使用泛型,那么这意味着你在运行时不需要类对象,因为在泛型中你不能访问类对象,除非你显式地传递它。如果您在运行时不需要类对象,这意味着您不需要用forName
加载它,因此这与forName
不一致。如果你显式地传递类对象,那么这意味着你已经有了类对象,不需要加载它,这也与forName
不一致。
你的描述对我来说是这样的:"我想使用依赖注入,我应该自己滚吗?"
查看Spring(或Google的Guice)。我假设是Spring。