如何在Java中实现以下伪代码?
Object getInstance(Class<?> type)
{
switch (type)
{
case A.class:
return createA(param1, param2);
case B.class:
return createB(param3, param4, param5);
default:
throw new AssertionError("Unknown type: " + type);
}
}
我知道我可以使用Map<Class<?>, Callable<Object>>
(将类映射到返回对象的方法)来实现它,但是有更高效/可读的方法吗?
更新:我很抱歉误导伪代码。我并不是要暗示这些类没有arg构造函数。每个类的构造都不同。我知道 - 否则有效但从效率的角度来看并不好。它是O(n)。
答案 0 :(得分:2)
如何使用Class
对象创建新实例?
private static final Set<Class> ALLOWED_CLASSES =
new HashSet<>(Arrays.asList(A.class, B.class));
Object getInstance(Class<?> type) {
if (!ALLOWED_CLASSES.contains(type)) {
throw new AssertionError("Unknown type: " + type);
}
return type.newInstance();
}
答案 1 :(得分:0)
不要使用switch
,只需使用if
。
if (type == A.class) {
return new A();
} else if (type == B.class) {
return new B();
} else {
throw new AssertionError("Unknown type: " + type);
}
通过这种方式,您还可以在if
条件中处理更详细的情况,例如子类或接口等。它还允许构造函数可选地包含其他参数(遵循类似工厂的模式),这将成为如果你把它们扔进地图或使用反射,会更难。
答案 2 :(得分:0)
如果所有构造函数都没有参数调用,
Object getInstance(Class<?> type) {
return type.newInstance();
}
否则,如果变体数量很少,请使用if statements
,
否则按预期使用地图。
答案 3 :(得分:0)
如果对new
的调用都不需要参数,那么您可以使用newInstance()
。然后我们只添加一些错误条件代码:
private static final List<Class> classes = Arrays.asList(A.class, B.class, ...);
public static Object getInstance(Class<?> type) {
if (classes.contains(type))
return type.newInstance();
throw new AssertionError("Unknown type: " + type);
}