单例对象
-
Scala单例对象是十分重要的,因为没有像在Java一样,有静态类、静态成员、静态方法,但是Scala提供了object对象,这个object对象类似于Java的静态类,它的成员、方法都默认是静态的。
-
object的好处:里面的成员和方法,都是一些共享的全局变量,可以被随时调用。但是千万要记住,如果静态成员希望被外界访问,则该成员不能被private修饰
-
与java的不同
- java类中的静态成员和方法,会在类加载时就会执行,即使不去调用
- scala中的object只有在第一次使用的时候才会执行 并不是加载的时候就去执行的
- object定义的类型,本身是有一个隐形无参的构造器
- 所以也就不能用new来初始化来向object来传递值,但是它会在第一次使用的时候初始化
- 之所以main方法要放在object中就是因为,object中的方法,是一个全局的方法,可以从作用域的角度来理解。
- 使用单例对象的成员:对象名.成员,因为作用域是全局有效的,所以不用像类一样实例化
单例对象的使用场景:
- 作为存放工具函数或常量的地方
- 高效地共享单个不可变实例
- 需要使用单个实例来协调某个服务时
Scala单例对象示例:
object Singleton{
def main(args:Array[String]){
SingletonObject.hello() // No need to create object.
}
}
object SingletonObject{
def hello(){
println("Hello, This is Singleton Object")
}
}
伴生对象
-
所谓伴生对象,也是一个Scala中的单例对象,使用object关键字修饰。
-
除此之外, 还有一个使用class关键字定义的同名类, 这个类和单例对象存在于同一个文件中, 这个类就叫做这个单例对象的伴生类, 相对来说, 这个单例对象叫做伴生类的伴生对象。
-
一定要在同一个源文件里定义类和它的伴生对象
-
类和它的伴生对象可以互相访问其私有成员
-
类可以访问伴生对象中的所有成员,并且可以访问private的成员,由于伴生对象的定义不在伴生类中,所以访问伴生对象中的成员,仍然需要对象名.成员
伴生对象的使用场景:
- 伴生对象很多时候是作为伴生类的静态成员的封装区域,你可以把它想象成为一个集合,这样就可以在里面做很多需要静态属性或者方法,完成的工作
- 单例对象的成员是对全局可访问,那么伴生对象就更加细化一点:是关于这个伴生类的成员是对全局可访问
伴生对象实例:
import scala.collection.mutable.Map
class ChecksumAccumulator {
private var sum = 0
def add(b: Byte) {
sum += b
}
def checksum(): Int = ~(sum & 0xFF) + 1
}
object ChecksumAccumulator {
private val cache = Map[String, Int]()
def calculate(s: String): Int =
if (cache.contains(s))
cache(s)
else {
val acc = new ChecksumAccumulator //在伴生对象中实例化了伴生类
for (c <- s) acc.add(c.toByte)
val cs = acc.checksum()
cache += (s -> cs)
cs
}
}
object Summer {
def main(args: Array[String]) {
//通过伴生对象直接访问了一个关于处理伴生类的方法
println(ChecksumAccumulator.calculate("Every value is an object."))
}
}
//执行结果
-248
网友评论