Scala singleton作为另一个类的实例

时间:2015-03-25 13:23:49

标签: scala class singleton instance

我有一个单例对象,它为我的应用程序处理数据库的东西,但是我想在测试期间使用一个类似的类,这样我就可以拥有许多不会相互干扰的小型测试数据库。

我可以放弃单例并在启动时创建一个新的数据库类实例,但这意味着我必须将这个实例传递给需要数据库操作的所有地方,我不要那样。

我可以创建一个单例,它可以作为数据库类的单个实例的接口。像这样:

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

这只是一种愚蠢和毫无意义的感觉,特别是当数据库类相当大并且我必须对所有方法都这样做时。有没有更好的方法来解决这个问题?

谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

创建蛋糕模式后,您只需要有一个特性来实现"其他数据库"仅用于测试源代码的测试。当然,这个特性实现了真正的DB"在主要源代码上。

答案 1 :(得分:0)

在我看来,你的问题涉及到一个类的多个不同的内容,并且能够作为单个对象访问它们。为清楚起见,请注意这些事情是矛盾的。

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

对我来说,你对这些中的任何一个都不满意。如果语法DB.instance困扰您,您始终可以将此实例放在 package object 中并直接使用它。您也可以import DB._直接访问instance变量。