Scala 单例作为另一个 class 的实例

Scala singleton as instance of another class

我有一个单例对象,它为我的应用程序处理数据库内容,但我想在测试期间使用一个类似的 class,这样我就可以拥有许多不会干扰的较小的测试数据库彼此。

我可以只删除单例并在启动时创建一个新的数据库实例 class,但这意味着我必须将这个实例传递到需要数据库操作的任何地方,而且我不想这样。

我可以制作一个单例,作为数据库单个实例的接口class。像这样:

object DB{
    val db = new Database()
    def set(a:Int,b:Int) = db.set(a,b)
    def get(a:Int) = db.get(a)
}

这感觉有点愚蠢和毫无意义,尤其是当数据库 class 相当大并且我必须对所有方法都这样做时。有没有更好的办法解决这个问题?

谢谢!

实现这一目标的最佳方法是使用蛋糕模式,但您确实必须扩展 DB class 中的所有方法。

为了做到这一点,我将遵循这篇文章:http://www.warski.org/blog/2014/02/using-scala-traits-as-modules-or-the-thin-cake-pattern/

创建蛋糕模式后,您只需拥有一个实现 "other DB" 的特性,仅用于测试源代码的测试。而且,当然,在主要源代码上实现 "real DB" 的特征。

在我看来,您的问题涉及 class 的多个不同实例,并且能够将它们作为单个对象进行访问。为了清楚起见,请注意这些东西有点矛盾。

因此,您需要组合来引用您要使用的任何实际实例。然后,您要么直接公开此实例 (DB.instance.doSomething()),要么像您提到的那样努力转发 API。

在我看来,您对其中任何一个都不满意。如果语法 DB.instance 困扰你,你总是可以把这个实例放在 package object 中并直接使用它。您还可以 import DB._ 直接访问 instance 变量。