原创转载请注明出处: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编程思想
本文深入探讨了Scala中伴生对象的概念与应用,包括如何通过伴生对象实现单例模式,以及如何利用伴生对象来管理类实例共享的状态。此外,还介绍了伴生对象中的方法与字段如何与类实例交互,以及如何利用伴生对象作为工厂方法。
7868

被折叠的 条评论
为什么被折叠?



