【问题标题】:Singleton vs Static Class for File Writing and a Mock-Data Base用于文件写入和模拟数据库的单例与静态类
【发布时间】:2014-09-08 15:52:42
【问题描述】:

我确实知道这个问题以前被问过很多次,但我无法从中得到我想要的答案。这个问题是,“我应该使用单例还是包含所有静态成员和方法的类?”

我只需要一个实例来实现我想要实现的目标,并且两种方式都可以同样有效。那么在设计上,有没有更好的方法呢?还是我应该使用其中任何一个?

第一种情况:

我正在尝试为我的程序编写一个“数据库”类。这个“数据库”使用其他对象来存储和组织数据。然而,数据库本身对数据进行排序和搜索。鉴于它是一个数据库,我只想要它的一个实例。我不想访问多个位置来获取数据。数据库本身会处理。

注意-我已经把它写成枚举Data.BASE。它使用方法handle(String) 获取字符串命令并通过调用其他方法来操作其中的数据。我是否应该将Data.BASE 包装在“静态类”中并用它与Data.BASE 交谈? (我直接和Data.BASE交流)

第二种情况:

我正计划创建一个类,该类旨在从我的名为SettingsManager 的程序中加载和保存设置。它将使用,而不是实现Savable 接口来操作具有可保存设置的对象。 SettingsManager 将在程序开始和结束时调用。但是,它只能操作添加到它的对象 (SettingsManager.add(Savable))。就像第一种情况一样,我不需要它的多个实例。我只想要一个实例来跟踪书写和保存偏好。

有没有我想不出的更好的解决方法?

我确实认识到这不是一个特定的编码问题。但是,我觉得这些都是重要的设计和风格问题,我肯定需要在将来为其他程序参考。

【问题讨论】:

  • 我要出去吃午饭了。因此,如果我没有立即回复任何答案/cmets,我深表歉意。

标签: java database singleton static-classes


【解决方案1】:

对于第一种情况,如果它在任何给定时间在您的 JVM 中只是一个实例,则将其设为最终静态;这更快。

对于第二种情况,如果SettingsManager正在操作数据库中的数据,那么你可以进行依赖注入,让框架决定何时启动和销毁它。

您提供的信息不多,所以我无法确切告诉您什么更好。例如,如果我们知道您正在使用 Java EE 或 Java SE,或者您正在使用任何可以帮助我们为您提供更好建议的框架(如 Spring - SpringMVC)。

【讨论】:

  • 好的,关键是你只需要一个实例。而且您不希望您的代码在项目的其他任何地方被错误地实例化两次。所以我的建议是让那个类单例。此链接可能会对您有所帮助。您可能不会碰巧在您的项目中使用 DI,但最好自己实现类似的东西(从设计角度来看):blog.rocketscience.io/dependency-injection-with-cdi-in-java-se
  • 好的,谢谢。稍后我会查看该链接。我所在的计算机网络正在阻止该站点...
【解决方案2】:

我会使用依赖注入。
如果您只需要一个数据库连接器对象,请创建一次并将其传递给需要它的组件。
仅仅因为您只想要一个实例并不意味着您必须使用单例模式/反模式。

【讨论】:

  • 好吧,没有太多可以传递的。我的 GUI 通过获取用户命令并将命令传递给数据库来直接访问数据库。数据库负责将所有内容保存在一起。我可以深入我的层次结构,但我认为我不必这样做。
  • 另外,依赖注入对我来说是一个新概念。我得四处看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多