Тип объекта Java, представленный переменной - PullRequest
0 голосов
/ 14 января 2019

Как я могу представить тип объекта с помощью переменной, такой как строка. Например, у меня есть DrawPanel1, DrawPanel2, DrawPanel3, полностью через DrawPanel12. и в отдельном классе у меня есть метод для создания каждого с "DrawPanel1 panel = new DrawPanel1();", но я хочу иметь метод.

public void TestPanel(int panelNum){} 

, где он так создает DrawPanel(panelNum), поэтому, если передано 2, создается новый DrawPanel2.

Я думал сделать это с [String Panel = ("DrawingPanel"+panelNum);] но когда я использовал Panel вместо имени объекта, он не работал.

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Мне кажется, я понимаю, о чем вы спрашиваете, и я собираюсь дать ответ на ваш ближайший вопрос. Однако то, что вы пытаетесь сделать, звучит немного слишком сложно. Следующее может потребоваться немного настроить ...

public void testPanel(Class<?> clazz) {
    Object instance = Class.forName(class.getName());
    ...
}

На данный момент экземпляр не принесет вам много пользы. Вы также можете создать интерфейс DrawPanelI с методами, используемыми вашими различными DrawPanel, и каждый из них реализует этот интерфейс. Затем измените экземпляр объекта на экземпляр DrawPanelI. Теперь вы можете вызывать общие методы через экземпляр.

0 голосов
/ 14 января 2019

Если есть интерфейс 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);
0 голосов
/ 14 января 2019

Иметь переменные 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...