为啥 JavaFX 是单例的?

Posted

技术标签:

【中文标题】为啥 JavaFX 是单例的?【英文标题】:Why is JavaFX singleton?为什么 JavaFX 是单例的? 【发布时间】:2018-01-12 22:29:57 【问题描述】:

我想要一个 Java GUI 库,允许这样的事情:

Window window1 = new Window();

window1.show();

Window window2 = new Window();

window2.show();

...

但是JavaFX窗口需要在其自身扩展Application的类中启动,不能多次实例化。

为什么不能像其他类一样实例化 JavaFX 窗口?为什么它被称为应用程序而不是窗口或框架?为什么 JavaFX 会破坏 OOP?为什么我们必须使用与反射混合的单例?我不想要魔法,我想要一个 OOP 行为的窗口对象出现在屏幕上。

【问题讨论】:

在 Windows 上使用 Stage 我投票结束这个问题作为题外话,因为这个问题似乎是“为什么这个框架是这样的”的形式,这似乎不是范围内的编程问题这个论坛的。 (此外,这个问题是基于明显错误的假设。) 【参考方案1】:

但是JavaFX窗口需要在其自身扩展Application的类中启动,不能多次实例化。

这句话是错误的,Window类的构造函数调用有限制,但与扩展Application类无关。

为什么不能像其他类一样实例化 JavaFX 窗口?

Window类的构造函数是受保护的,所以可以是"used only within the package and in sub-classes outside the package"。

相反,在您的应用程序中,实例化一个作为Window 子类的类。要使用的适当类是Stage。 constructors of Stage 是公开的,而不是像 Window 那样受保护。

因此,要显示两个阶段(即窗口),您可以编写:

Stage stage1 = new Stage();
stage1.show();

Stage stage2 = new Stage();
stage2.show();

为什么叫Application而不叫Window或Frame?

一个应用程序被称为应用程序,因为它代表什么。在一个应用程序中,您可能有多个阶段(它们是 Windows 的实例),因此将应用程序称为窗口是没有意义的。无论如何,应用程序有不同的目的:它的主要目的是实现应用程序生命周期接口和处理,如Application javadoc 中所述。

为什么 JavaFX 会破坏 OOP?

它没有。它在 Window 上使用 protected 修饰符来强制执行encapsulation,这是 OOP 的一种关键隐藏技术。它通过inheritance 为不同目的提供Windows 子类,例如Stages,这是您的标准应用程序窗口,以及PopupWindows,它们是专门的窗口子集,可帮助执行诸如为上下文菜单和组合框创建弹出列表等任务.它通过在不同的类结构中区分ApplicationWindow 功能来实现Separation of Concerns。

你的其他问题和陈述对我来说毫无意义。

【讨论】:

我认为我们可以为现有架构添加另一个原因:它有助于管理与 EDT 等效的 JavaFX。

以上是关于为啥 JavaFX 是单例的?的主要内容,如果未能解决你的问题,请参考以下文章

什么是单例的替代品

为啥禁用舞台可调整大小在 javafx 中不起作用?

为啥 javafx 会破坏我的半透明游标?

JavaFX打包到Android上

与基于摇摆的图表相比,为啥基于 javafx 的图表占用更多内存

SpringMVC中的controller默认是单例的原因