我有接口 Tree
和抽象类 RBTree
,它实现了这个接口。我还有几个类Tree1
... Tree9
,它们扩展了这个抽象类。
我写了一个测试单元,我想做这样的事情:
public void testRandom(RBTree tree){
for(int i = 0; i < 10; i++){
rbTree = new Tree1(); //if the tree in the parameter was of instance Tree1
rbTree = new Tree2(); //if the tree in the parameter was of instance Tree2
//etc.
/**
* do something with rbTree
*/
}
}
是否可以使用带有大量instanceof()
的if语句链(或开关)
(注意:我无法改变设计的任何内容,我知道这不是最佳选择)
答案 0 :(得分:3)
您可以使用tree.getClass().newInstance()
。
如果你想要比实例化更复杂的逻辑,你可能需要instanceof方法,或者更好 - 让每个RBTree
子类都有一个执行该逻辑的方法(并在{ {1}})
答案 1 :(得分:2)
试试这个:
rbTree = tree.class.newInstance();
答案 2 :(得分:1)
使用反射,你可以:
string name = tree.getClass().getName()
Class.forName(name).newInstance();
问题是如果实际的实现有不同的方法等,你将无法访问它们。