如何用变量(例如字符串)表示对象类型。例如,我一直通过DrawPanel12拥有DrawPanel1,DrawPanel2,DrawPanel3。
在一个单独的类中,我有一个方法可以用“ DrawPanel1 panel = new DrawPanel1();
”创建每个对象,但我想有一个方法。
public void TestPanel(int panelNum){}
在其中创建DrawPanel(panelNum)
的位置,因此,如果传入2,则会创建一个新的DrawPanel2。
我考虑过使用[String Panel = ("DrawingPanel"+panelNum);
]
但是当我使用面板而不是对象名称时,它将无法正常工作。
答案 0 :(得分:1)
我想我理解您的要求,并且我将为您的即时问题提供答案。但是,您尝试的操作听起来有些复杂。以下内容可能需要一些调整...
public void testPanel(Class<?> clazz) {
Object instance = Class.forName(class.getName());
...
}
在这一点上,实例对您没有多大帮助。您还可以使用不同的DrawPanel所使用的方法创建一个DrawPanelI接口,并让它们各自实现该接口。然后,将Object实例更改为DrawPanelI实例。现在,您可以通过实例调用通用方法。
答案 1 :(得分:0)
具有变量DrawPanel1-DrawPanel12是非常耗时的任务。相反,拥有它们的列表会容易得多。
//Making the list
List<DrawPanel> drawPanels = new ArrayList<DrawPanel>();
//Adding to the list
drawPanels.add(new DrawPanel());
//Retrieving from the list
DrawPanel panel = drawPanels.get(0);//"DrawPanel1"
//Processing the list
for (DrawPanel panel: drawPanels){
panel.doStuff();
}
答案 2 :(得分:0)
假设有一个DrawPanel
接口,则可以使用工厂模式:
public class DrawPanelFactory() {
public DrawPanel create(int whichTypeOfPanel) {
if (whichTypeOfPanel == 1) {
return new DrawPanel1();
}
...
if (whichTypeOfPanel == 12) {
return new DrawPanel12();
}
throw new IllegalArgumentException("Unsupported panel type:" + whichTypeOfPanel);
}
}
最终有很多if
语句,但是仍然很容易测试。为避免使用if
语句,请使用静态Map<Integer, DrawPanelFactoryDelegate>
将特定的整数值与特定的工厂关联,该工厂知道如何创建特定类型的DrawPanel
:
public class DrawPanelFactory() {
private static Map<Integer, DrawPanelFactoryDelegate> drawPanelFactories = new ...;
static {
drawPanelFactories.put(1, new DrawPanelFactory1());
...
drawPanelFactories.put(12, new DrawPanelFactory12());
}
public DrawPanel create(int whichTypeOfPanel) {
DrawPanelFactoryDelegate delegateFactory = drawPanelFactories.get(whichTypeOfPanel);
if (delegateFactory != null) {
return delegateFactory .create();
}
throw new IllegalArgumentException("Unsupported panel type:" + whichTypeOfPanel);
}
}
interface DrawPanelFactoryDelegate {
public DrawPanel create();
}
DrawPanel1Factory implements DrawPanelFactoryDelegate {
public DrawPanel create() {
return DrawPanel1();
}
}
...
DrawPanel12Factory implements DrawPanelFactoryDelegate {
public DrawPanel create() {
return DrawPanel12();
}
}
然后在使用:
DrawPanelFactory drawPanelFactory = new DrawPanelFactory();
DrawPanel aDrawPanel = drawPanelFactory.create(1);
...
DrawPanel yetAnotherDrawPanel = drawPanelFactory.create(12);