您好,欢迎来到二三娱乐。
搜索
您的当前位置:首页[译]Scala单例对象

[译]Scala单例对象

来源:二三娱乐
package test

object Blah {
  def sum(l: List[Int]): Int = l.sum
}

这个sum方法是全局可用的,并且可以用test.Blah.sum来引用或引入。

伴生

大部分单例对象不是独立的,而是和相同名字的类关联。前面提到的Case类的同名单例对象,就是一个例子。这种情况下,单例对象被称为类的伴生对象(companion object),类称为对象的伴生类(companion class)

class IntPair(val x: Int, val y: Int)

object IntPair {
  import math.Ordering
  implicit def ipord: Ordering[IntPair] =
    Ordering.by(ip => (ip.x, ip.y))
}

给Java程序员提示

Scala中static不是一个关键字。相反,所有成员都是静态的,包括类,都应该归为单例对象。它们可以用相同的语法引用,单独或者作为一个整体被引入等等。

Java程序员会频繁定义静态成员,也许是private的,作为实例成员的辅助实现。这些都转为使用伴生对象,一种常用模式是在类中引入伴生对象的成员。如下:

class X {
  import X._

  def blah = foo
}

object X {
  private def foo = 42
}

这种使用方式展现了另外一个特性:在private上下文中,类和它的伴生对象是友元。object X可以访问class X的私有成员,反之亦然。想要有真正的私有成员,使用private[this]

为了给Java提供方便,在单例对象中直接定义的方法(包括varval)也会在伴生类中定义静态方法,叫做static forwarder。对于object X,其它成员可以用X$.MODULE$静态字段访问。如果你把所有实现都放在伴生对象中并且发现就剩下一个不用实例化的类了,那就把类删掉。static forwarder仍然会被创建。

Copyright © 2019- yule263.com 版权所有 湘ICP备2023023988号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务