使用代码比使用单词更容易理解这个问题:
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();
在最后一行
有什么想法吗?
提前致谢。
答案 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对象的构造函数成为虚拟构造函数,然后创建另一个执行实际初始化的方法,这种方法很昂贵。
当您知道您将需要哪个孩子时,请调用此方法进行昂贵的初始化。