zoukankan      html  css  js  c++  java
  • Scala学习 -- 单例对象

      Scala 比 Java 更面向对象一点,是 Scala 的类不允许静态(static)成员。对此类使用场景,Scala 提供了 单例对象(object)。单例对象的定义看上去跟类定义很像,只不过 class 关键字被换成了 object 关键字。

      在事例中单例对象名叫 ChecksumAccumulator, 跟前一个例子中的类名一样。

      当单例对象跟某个类公用同一个名字时,它被称作这个类的 伴生对象(companion object)。

      必须在同一个源码文件中定义的类和类的伴生对象。同时,类又叫做这个单例对象的伴生类。类和他的伴生对象可以互相访问对方的私有成员。

    import scala.collection.mutable
    object ChecksumAccumulator {
        private val cache = mutable.Map.empty[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
            }
    }

     

      可以把单例对象当作是用于安装那些用Java是打算编写的静态方法。可以用类似的方法来访问单例对象的方法:单例对象名.方法名

    ChecksumAccumulator.calculate("Every value is an object.")
    

      

      类和单例对象的一个区别是单例对象不接受参数,而类可以。由于你没法用 new 来实例化单例对象,也就没有任何手段来向他传参。每个单例对象都是通过一个静态变量引用 合成类 的实例来实现的,因此单例对象在初始化的语句上跟 Java 的静态成员是一致的。尤其体现在,单例对象在有代码首次访问时才被初始化。

     

  • 相关阅读:
    js去除字符串空格(空白符)
    jq以固定开头的class属性的名称
    day--38 mysql表的完整性约束总结
    day--39-MySQL的多表查询
    day--40 mysql-视图,触发器,存储过程,函数总结
    day--41 mysql索引原理与慢查询优化
    day--42 前端基础小结
    day--43 HTML标签和CSS基本小结
    day46----JavaScript的函数及对象小结
    JavaScript正则表达式
  • 原文地址:https://www.cnblogs.com/Lyh1997/p/11734857.html
Copyright © 2011-2022 走看看