美文网首页程序员
Scala 单例对象与伴生对象

Scala 单例对象与伴生对象

作者: 他与理想国 | 来源:发表于2018-08-14 09:45 被阅读49次

单例对象

  • 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

相关文章

网友评论

    本文标题:Scala 单例对象与伴生对象

    本文链接:https://www.haomeiwen.com/subject/vadmbftx.html