我得到了编码,你基本上提供了一个“对象SomeClass”和一个“SomeClass类”,伴侣类是类声明,对象是singleton。其中您无法创建实例。所以...我的问题主要是在这个特定实例中单个对象的目的。
这基本上只是一种在Scala中提供类方法的方法吗?与Objective-C中基于+
的方法一样?
我正在阅读Programming in Scala书,第4章刚刚谈到了单身对象,但它没有详细说明为什么这很重要。
我意识到我可能会在这里超越自己,以后可能会更详细地解释。如果是这样,请告诉我。到目前为止,这本书相当不错,但它有很多“Java,你这样做”,但我的Java经验很少,我有点想念我的一点点。我不希望这是其中一种情况。
我不记得在Programming in Scala website的任何地方读到Java是阅读本书的先决条件......
答案 0 :(得分:54)
是的,伴侣单例提供了与Java(以及C ++,c#等)静态方法相同的功能。
(实际上,为了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的方式。