您可能要考虑的另一个解决方案如下:
Map<Integer, Class<? extends Processor>> map = new HashMap<>();
// Integer.valueOf(x) used to prevent autoboxin just a matter of opinion.
map.put( Integer.valueOf( 0 ), MyProcessor.class );
Processor chosen = map.get( userIn ).getConstructor( String.class ).newInstance( projectKey );
launcher.addProcessor(chosen);
它基本相同,但不同的是返回的对象是类型Processor
,并且类确实存在。当您使用字符串时Class.forName(...)
,可能会引发两个额外的异常。如果方法没有找到给定名称的类,首先ClassNotFoundException
将抛出 which 。Class.forName()
第二个附加异常是ClassCastException
如果创建的对象不是Processor
.
解释:
我们正在使用以 aInteger
作为我们的键和 aClass<? extends Processor>
作为我们的值的映射。可以将Class<T>
对象视为相应 .class 文件的对象表示(技术上不正确,但为简单起见,我们假设是这样)。<? extends Processor>
在混凝土中是什么意思?这意味着地图将只允许作为实现或子类型的类的值Processor
。这样做消除了 a 的线程,ClassCastException
因为如果我们只能存储扩展 Processor 的类,我们只能检索可以转换为 an 的类,Processor
而没有任何问题,甚至是 one 的线程。
注意:我链接了实例化过程,这在生产环境中通常是一个坏主意,但它大大缩短了代码,并且无需进一步解释它,因为您在自己的答案中使用了完全相同的方法。