为啥 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,它们是专门的窗口子集,可帮助执行诸如为上下文菜单和组合框创建弹出列表等任务.它通过在不同的类结构中区分Application
和Window
功能来实现Separation of Concerns。
你的其他问题和陈述对我来说毫无意义。
【讨论】:
我认为我们可以为现有架构添加另一个原因:它有助于管理与 EDT 等效的 JavaFX。以上是关于为啥 JavaFX 是单例的?的主要内容,如果未能解决你的问题,请参考以下文章