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

Java:使用class.forname.newinstance vs if语句基于字符串创建对象,java,Java,在通过String搜索创建对象时,我遇到了class.forname.newInstance。 我知道使用前一种方法比使用关键字new要花更长的时间,但是要花多长时间呢?如果我想根据字符串的值创建100个类的实例,需要多长时间?从运行时的角度来看,只执行100条if语句是否更好(我不介意这样做,真的…)使用new操作符非常快速且优化,因为它执行编译时构造 Class.forName().newInstance()执行动态构造,这比new运算符慢得多,因为在运行时对象的类型不容易知道,并且无法执行

在通过
String
搜索创建对象时,我遇到了
class.forname.newInstance

我知道使用前一种方法比使用关键字
new
要花更长的时间,但是要花多长时间呢?如果我想根据
字符串的值创建100个类的实例,需要多长时间?从运行时的角度来看,只执行100条if语句是否更好(我不介意这样做,真的…)

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

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

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

为了回答您的确切问题,如果您更喜欢Class.forName()。newInstance()将比新操作符花费您4倍的成本(至少在我的系统中,当我测试代码进行100次操作时)


因为您有100个可能的子类,所以编写100个
if
似乎非常冗长且容易出错

正如arunprakashpj所说,出于同样的原因,我不会使用反射,但是如果两者都不使用,我也不会使用100
。相反,我将通过使用
new
操作符执行以下操作来减少一点冗长:

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

所有这些类都有共同的超类型吗?是的,它们都有相同的构造函数并扩展相同的类。
private static YourBaseClass construct(String classname) {
    return constructors.getOrDefault(classname, DummyImpl::new).get();
}