美文网首页程序员
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