java泛型vs动态加载类使用class . forname()



假设我正在创建一个名为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。

相关内容

  • 没有找到相关文章

最新更新