运行时派生类选择

时间:2014-04-02 19:20:48

标签: java

我的情况是我的代码结构看起来像。

class BaseClass .. 
class DerivedClass1 extends BaseClass ...
class DerivedClass2 extends BaseClass ...
class DerivedClass3 extends BaseClass ...

现在在运行时我想使用基于整数classId的任何一个派生类。

类似的东西,

BaseClass myObj = new ((classId == 1) ? DerivedClass1 : (classId == 2) ? DerivedClass2 : DerivedClass3

我想要某种随机行为。例如,有一次我的应用程序可能会绘制一条线,而在其他时候它可能会画一个圆圈 如何在Java中编写上述功能?

2 个答案:

答案 0 :(得分:2)

只需使用多态和任何你想要的样式(switch / if-else)。例如:

BaseClass myObj;

switch(classId): {
  case 1:
     myObj = new DerivedClass1();
     break;
  case 2:
     myObj = new DerivedClass2();
     break;
  case 3:
     myObj = new DerivedClass3();
     break
  default:
     throw RuntimeException ("Id not recognized);
}
Do something with object;

答案 1 :(得分:2)

这是一个非常反模式,因为它类似于标记类,根据Effective Java建议不要使用。

通常,在java中执行此类操作的方法是让工厂实例化BaseClass子类型的对象。这可能对您的情况有帮助,也可能没有帮助,因为您可能需要根据上下文动态生成不同的实例。

我不建议一般使用整数ID,因为事实证明它不是非常健壮(如果整数没有映射到某个类型怎么办?)。您可以使用Class<? extends BaseClass>对象,并通过反射或嵌套if语句实例化。

您的具体用例是什么?更多信息可能有助于我们提出更清晰,更强大的解决方案。