变量表示的Java对象类型

时间:2019-01-14 20:22:00

标签: java object variables

如何用变量(例如字符串)表示对象类型。例如,我一直通过DrawPanel12拥有DrawPanel1,DrawPanel2,DrawPanel3。 在一个单独的类中,我有一个方法可以用“ DrawPanel1 panel = new DrawPanel1();”创建每个对象,但我想有一个方法。

public void TestPanel(int panelNum){} 

在其中创建DrawPanel(panelNum)的位置,因此,如果传入2,则会创建一个新的DrawPanel2。

我考虑过使用[String Panel = ("DrawingPanel"+panelNum);] 但是当我使用面板而不是对象名称时,它将无法正常工作。

3 个答案:

答案 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);