Java:如何在Class上实现切换?

时间:2014-01-15 05:36:48

标签: java class switch-statement

如何在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)。

4 个答案:

答案 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);
}