在不知道Java中类的名称的情况下调用类构造函数

时间:2016-02-14 09:55:44

标签: java dictionary

使用代码比使用单词更容易理解这个问题:

Map<Integer, Parent> objectMap = new HashMap<Integer, Parent>();

Parent myParent;
Child1 myChild1;
Child2 myChild2;
//A lot more myChilds

myChild1 = new Child1();  //Constructor is expensive, object may not get used
myChild2 = new Child2();  //Constructor is expensive, object may not get used
//Call constructor for all of myChilds

objectMap.put(1, myChild1);
objectMap.put(2, myChild2);
//Place all the myChilds in the objectMap


Parent finalObject;

int number = 1; //This can be any number

finalObject = objectMap.get(number);

如您所见,我事先并不知道finalObject会是哪一个类。代码工作没有问题,但这是我的问题:

如何避免调用所有构造函数?

由于只使用myChild1或myChild2且构造函数方法非常昂贵,我只想调用实际使用的那个。

这样的东西
finalObject.callConstructor();

在最后一行

有什么想法吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

.class存储在地图中,然后在需要时使用Class.newInstance()

final Map<Integer, Class<? extends Parent>> objectMap = new HashMap<>();
objectMap.put(1, Child1.class);
objectMap.put(2, Child2.class)
// ...

// then later
final Parent aChild1 = objectMap.get(1).newInstance()

答案 1 :(得分:1)

您可以使Child对象的构造函数成为虚拟构造函数,然后创建另一个执行实际初始化的方法,这种方法很昂贵。

当您知道您将需要哪个孩子时,请调用此方法进行昂贵的初始化。