首页 文章

Scala中单例对象的说明

提问于
浏览
35

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

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

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

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

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

4 回答

  • 4

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

    class Planet
    object Earth extends Planet
    object Sun extends Planet
    

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

  • 54

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

    (实际上,为了Java互操作,伴随对象方法通过"static forwarders"公开)

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

    • 单例可以从其他类/特征继承方法,这是静态无法完成的 .

    • 单例可以作为参数传递(可能通过继承的接口)

    • 单例可以存在于周围类或方法的范围内,就像Java可以有内部类一样

    • 它必须是一个伴侣,在没有定义伴侣类的情况下定义单例是完全有效的 .

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

  • 2

    除了给出的答案之外(和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 函数 . 哪个"collapses"多个 T 在一起,只要有一个合适的 Monoid (具有中性元素的东西,并且可以某种方式在一起)为 T . 为了使用这个,我们只需要 one 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 本身就非常有用 .

    但等等,还有更多!在扩展伴侣类时,伴随对象也可以作为一种"default configuration":

    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 .

  • 14

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

相关问题