Почему JavaFX Application.launch() принимает класс в качестве аргумента?

Я новичок в javaFx и немного заглянул в исходный код и у меня есть вопрос, касающийся функции Application.launch, которая используется для запуска приложения.

Подпись выглядит так:

public static void launch(Class<? extends Application> appClass, String... args)

И мой вопрос, почему это не выглядит так:

 public static void launch(Application app, String... args)

Чего пытаются достичь авторы, принимая класс в качестве аргумента?

4 ответа

Потому что экземпляр Application это сложная задача, которую разработчики FX должны контролировать.

Application конкретизации:

  • требует, чтобы "FX toolkit" был инициализирован заранее
  • отличается для режимов рабочего стола, jnlp и плагина
  • требует определенного времени
  • должен вызываться в специальном потоке "launcher"
  • должен вызывать события жизненного цикла приложения
  • следует прочитать параметры приложения (из файла CLI или jnlp)

Таким образом, вы предоставляете только имя класса для запуска, а JavaFX выполняет всю необходимую работу, включая создание объекта для вас.

Я думаю, что одна из причин заключается в том, что таким образом он работает так, как если бы вы могли запускать напрямую через "java my.pkg.MyApp", который теперь можно использовать в Java8/FX8, потому что он находится на пути к классам.

Для точного ответа вам, вероятно, придется спросить в списке рассылки openjfx.

Вероятно, они используют Reflection под капотом. Примерно так: получить имя класса в качестве аргумента launch() затем позвоните start() этого класса.

Как и в случае с другими вопросами на стеке, где люди спрашивают, чего пытались достичь авторы, мы не осведомлены о принимаемых ими решениях.

Аргумент class обозначает непосредственно включающий класс метода, который вызвал launch

Другие вопросы по тегам