Scala Companion Objects

原创转载请注明出处:http://agilestyle.iteye.com/blog/2333761

 

Scala跟踪感兴趣的对象的方式是默默地传递一个指向该对象的引用,这个引用可以用关键字this获取。可以显示地访问this,但是大多数时候并不需要访问它。

ObjectsAndMethods.scala

package org.fool.scala.companionobjects

class X(val n: Int) {
  def f = n * 10
  def fuc = this.n * 10
}

object ObjectsAndMethods extends App {
  val x1: X = new X(1)
  val x2: X = new X(2)

  println(x1.f)
  println(x2.f)
  println(x1.fuc)
  println(x2.fuc)
}

Console Output


 

Scala的object关键字定义了看起来大体上与类相同的事物,只是不能创建object任何实例,它是唯一的。object提供了一种方式,把在逻辑上彼此紧密关联但是无需多个实例的方法和域收集在一起。因此,永远不能创建它的任何实例,它只有一个实例,那就是它自己。

ObjectKeyword.scala

package org.fool.scala.companionobjects

object Y {
  val n = 2
  def f = n * 10
  def g = this.n * 20
}

object ObjectKeyword extends App {
  println(Y.n)
  println(Y.f)
  println(Y.g)
}

Console Output


 

object关键字允许创建类的伴随对象。普通对象和伴随对象的唯一差异就是后者的名字与常规类的名字相同,这就创建了伴随对象和它的类之间的关联,如果在伴随对象的内部创建一个域,那么不论创建多少个关联类的实例,都只会为该域产生单一的数据存储

ObjectField.scala

package org.fool.scala.companionobjects

class Z {
  def increment() = {
    Z.n += 1
    Z.n
  }
}

object Z {
  var n: Int = 0 // Only one of these
}

object ObjectField extends App {
  val z1 = new Z
  val z2 = new Z
  println(z1.increment())
  println(z2.increment())
  println(z1.increment())
}

Console Output

 

当一个方法只访问伴随对象的域时,将该方法移动到伴随对象中就变得很有意义了

ObjectMethods.scala

package org.fool.scala.companionobjects

class W

object W {
  var n: Int = 0

  def increment() = {
    n += 1
    n
  }

  def count() = increment()
}

object ObjectMethods extends App {
  println(W.increment())
  println(W.increment())
  println(W.count())
}

Console Output


 

伴随对象的用法:对每个实例计数,并在显示对象时显示该计数值。
ObjCounter.scala

package org.fool.scala.companionobjects

class Count() {
  val id: Int = Count.id()

  override def toString = s"Count($id)"
}

object Count {
  var n = -1

  def id() = {
    n += 1
    n
  }
}

object ObjCounter extends App {
  println(Vector(new Count, new Count, new Count, new Count, new Count))
}

Console Output


 

当伴随对象的名字后面有圆括号时(里面带有适合的参数),Scala就会调用apply,比如在创建case类时,不必使用new来创建该类的实例,因为创建case类时会自动创建包含特殊方法apply的伴随对象,该方法称为工厂方法

FactoryMethod.scala

package org.fool.scala.companionobjects

class Car(val make: String) {
  override def toString = s"Car($make)"
}

object Car {
  def apply(make: String) = new Car(make)
}

object FactoryMethod extends App {
  val car = Car("Porsche")
  println(car)
}

Console Output


 

参考资料:

Scala编程思想

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值