java - 我应该使用单例作为程序状态吗?

标签 java design-patterns javafx singleton

我已阅读this SO article ,这告诉我们单例是非常非常邪恶的,应该像流行病一样避免。它还告诉我们,单例就像“全局”一样。

这让我想知道我是否真的需要一些类似于程序运行时状态的东西,单例会是一个坏主意吗?

例如,我有一个 JavaFX 应用程序,它可以生成许多窗口。每个窗口至少有两个样式表 - 一个用于控制布局(如对齐等),另一个用于主题。

主题样式表可以在运行时切换到另一个主题样式表,并且它应该全局影响在该实例中打开的所有窗口。对我来说,创建一个具有 ObservableList 样式表的单例类是有意义的,所有窗口都可以将其 Scene 的样式表属性绑定(bind)到该类。

真的是一个坏主意吗?如果它影响测试,它对测试的负面影响到底有多大?我知道每个窗口都应该彼此独立地进行测试,但实际行为是所有窗口都应该在主题上看起来相同。此外,我认为它不应该影响其他区域,每个窗口实际上应该彼此独立。

如果这真的很糟糕,那么在上面的示例中应该采取什么方法才能达到相同的结果?

最佳答案

实际上,您可以使用依赖注入(inject)来获得相同的行为。

在应用程序的主线中,您将实例化一个类似 UIContext 的类,每当您打开一个新窗口时,您都会将该 UIContext 实例赋予其构造函数。

所有窗口共享相同的 UIContext 实例,但它不是单例,只是您将整个 UIContext 注入(inject)到许多其他依赖类中。

也就是说,如果您需要实现测试,您可以毫不费力地向您的窗口提供示例/假 UIContext

关于java - 我应该使用单例作为程序状态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41052646/

相关文章:

java - LWUIT(J2ME) 列表在滚动后将元素对齐到网格

java - 无法推断功能接口(interface)类型 Java 8

java - 如何在编程语言中生成一些长度固定为 r 的同分布伪随机 vector ?

c - 管理加载到内存中的共享库的设计模式

JavaFX、场景生成器 (IntelliJ) 程序从 StackOverFlow 抛出 java.lang.reflect.InitationTargetException

JavaFX Stage 不会在 Android 中显示

java - 奇怪的 Jersey 错误 : java. lang.StackOverflowError

design-patterns - 什么时候以及为什么要使用策略模式?

ruby - 何时使用 Ruby DelegateClass 而不是 SimpleDelegator? (DelegateClass 方法与 SimpleDelegator 类)

请求焦点后,JavaFX 2 在表格 View 中设置插入符号位置编辑 TextField