Причина использования класса вместо фактического типа в этом примере Java? - PullRequest
1 голос
/ 13 января 2010

Я видел, как этот «шаблон проектирования» (не знаю, как еще назвать его… шаблон?) Неоднократно появлялся в коде Java. Ожидается, что приложение будет расширено и будет включать основной метод. Я не могу понять, какая польза от использования Class вместо AppFrame в методе start, поскольку он все равно просто приводится к типу AppFrame. Просто все это кажется таким бессмысленным, может быть, кто-то может заполнить меня.

public class Application {

 public static class AppPanel extends JPanel {
  //stuff
 }

 public static class AppFrame extends JFrame {
  protected AppPanel mainPanel;
  //more stuff
 }

 public static AppFrame start(Class appFrame) {
  try {

   final AppFrame frame = (AppFrame) appFrame.newInstance();
   java.awt.EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    frame.setVisible(true);
                }
            });
   return frame;
  } catch (Exception e) {
   e.printStackTrace();
   return null;
  }
 }

 public static void main(String[] args){
  Application.start(AppFrame.class);
 }
}

Ответы [ 3 ]

2 голосов
/ 13 января 2010

Я тоже это видел, особенно в довольно старых примерах.

Идея состоит в том, что все начинается с одного статического вызова, и пользователь ничего не создает в куче. Вместо этого «платформа приложения» каким-то образом создает то, что ей нужно, и пользователь только указывает, какие конкретные реализации использовать. Таким образом, пользователь указывает используемый класс, но на самом деле ничего еще не создано. Одним из рисков этого является то, что вы можете передать класс, экземпляры которого не конвертируются в AppFrame. Это может привести к исключению.

Я лично считаю этот уродливый дизайн. Это имеет смысл в языках, где более распространено непосредственное создание экземпляра класса через объект класса, такой как Smalltalk или Python. Я думаю, что в Java придерживаться заводских интерфейсов еще сложнее, но все же лучше.

2 голосов
/ 13 января 2010

Шаблон называется type token, термин, придуманный Гиладом Брачей и обсуждаемый в литералах класса в качестве токенов типа времени выполнения , а также , упомянутых здесь .Это интересный способ создания контейнера верхнего уровня, JFrame, но компоненты GUI должны быть построены на Thread Dispatch Thread (EDT) .В зависимости от //stuff в конструкторах и от того, как вызывается start(), это может смягчить эффект экранирования от этого .

1 голос
/ 13 января 2010

Подпись start () позволяет передавать любой класс, но реализация ограничивает его дочерними элементами AppFrame, а последний является просто вложенным статическим классом. Поскольку все складывается в один и тот же файл, я не понимаю, почему все это необходимо, и я согласен - способ, которым это реализовано в этом конкретном примере, не имеет смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...