Scala中单例对象的说明

时间:2011-06-30 21:37:52

标签: scala singleton

我得到了编码,你基本上提供了一个“对象SomeClass”和一个“SomeClass类”,伴侣类是类声明,对象是singleton。其中您无法创建实例。所以...我的问题主要是在这个特定实例中单个对象的目的。

这基本上只是一种在Scala中提供类方法的方法吗?与Objective-C中基于+的方法一样?

我正在阅读Programming in Scala书,第4章刚刚谈到了单身对象,但它没有详细说明为什么这很重要。

我意识到我可能会在这里超越自己,以后可能会更详细地解释。如果是这样,请告诉我。到目前为止,这本书相当不错,但它有很多“Java,你这样做”,但我的Java经验很少,我有点想念我的一点点。我不希望这是其中一种情况。

我不记得在Programming in Scala website的任何地方读到Java是阅读本书的先决条件......

4 个答案:

答案 0 :(得分:54)

是的,伴侣单例提供了与Java(以及C ++,c#等)静态方法相同的功能。

(实际上,为了Java互操作,通过“静态转发器”公开了伴随对象方法)

然而,单身人士在这方面走得更远。

  • 单身人士可以继承其他类/特征的方法,这是静态无法完成的。
  • 单例可以作为参数传递(可能通过继承的接口)
  • 单例可以存在于周围类或方法的范围内,就像Java可以有内部类
  • 一样
  • 值得注意的是,单身人士不一定是伴侣,定义单身人士而不定义伴侣班是完全有效的。

这有助于使Scala成为一种更加面向对象的Java语言(静态方法不属于对象)。讽刺,因为它主要是根据其功能性证据进行讨论。

答案 1 :(得分:14)

在许多情况下,我们需要一个单身人士代表我们软件系统中的独特对象。 想想太阳系。我们可能会有以下课程

class Planet
object Earth extends Planet
object Sun extends Planet

对象是一种创建单例的简单方法,当然它通常用于创建类级方法,如java中的静态方法

答案 2 :(得分:4)

除了给定的答案(并且与jilen的方向相同)之外,object在Scala的implicit机制中起着重要作用,例如允许类型类行为(从Haskell中已知):

trait Monoid[T] {
  def zero:T
  def sum(t1:T, t2:T):T
}

def fold[T](ts:T*)(implicit m:Monoid[T]) = ts.foldLeft(m.zero)(m.sum(_,_))

现在我们有一个fold - 函数。只要有适当的T(具有中性元素的东西,并且可以“某种程度上”加在一起“)Monoid,就会将一些T”折叠“在一起。为了使用此功能,我们只需要某种类型Monoid一个 T实例,这是object的完美作业:

implicit object StringMonoid extends Monoid[String] {
  def zero = ""
  def sum(s1:String, s2:String) = s1 + s2
}

现在可行:

println(fold("a","bc","def"))  //--> abcdef

所以object本身就非常有用。

但等等,还有更多! Companion对象在扩展其伴侣类时也可以作为一种“默认配置”:

trait Config {
  def databaseName:String
  def userName:String
  def password:String
}

object Config extends Config {
  def databaseName = "testDB"
  def userName = "scott"
  def password = "tiger"
}

所以一方面你有特征Config,这可以由用户实现,但另一方面,当你想要去时,有一个现成的对象Config使用默认设置。

答案 3 :(得分:2)

是的,它基本上是一种在用作伴侣对象时提供class methods的方式。