Java:使用class.forname.newinstance vs if语句基于字符串创建对象

时间:2016-10-09 00:58:29

标签: java

我在class.forname.newInstance搜索创建对象时遇到了String。 我知道使用前一种方法比使用关键字new需要更长的时间,但需要多长时间?如果我想根据String的值创建100个类的实例,需要多长时间?运行时间最好只做100个if语句(我不介意这样做,真的......)?

2 个答案:

答案 0 :(得分:1)

使用new运算符非常快速且优化,因为它执行编译时构造。

Class.forName()。newInstance()执行动态构造,它比new运算符慢得多,因为在运行时不容易知道对象的类型,并且无法执行某些Java虚拟机优化。

此外,反射具有安全限制,因为它们在安全管理器下运行时总是需要运行时权限我强烈建议不要使用反射,除非您有特定的理由这样做。

要回答您的确切问题,如果您更喜欢Class.forName()。newInstance()将比新运算符花费您4倍(在我测试代码100次操作时系统中的Atleast)。

Avoid using reflection

答案 1 :(得分:0)

由于您有100个可能的子类,因此编写100 if似乎非常冗长且容易出错。

正如arunprakashpj所说,出于同样的原因我不会使用反射,但我也不会使用100 if。相反,我会执行以下操作以减少冗长,但仍使用new运算符:

Map<String, Supplier<YourBaseClass>> constructors = new HashMap<>();
constructors.put("Impl1", Impl1::new);
constructors.put("Impl2", Impl2::new);
...

然后你可以像这样构建一个ImplXXX(如果需要的话):

private static YourBaseClass construct(String classname) {
    return constructors.getOrDefault(classname, DummyImpl::new).get();
}