zoukankan      html  css  js  c++  java
  • 聊聊 Scala 的伴生对象及其意义

    2019-04-22

    关键字:Scala 伴生对象的作用

    关于 Scala 伴生对象,比教材更详细的解释。


    什么是伴生对象?

    教材中关于伴生对象的解释是:实现类似 Java 中那种既有实例成员有静态成员的类的功能。

    为什么上面说它是一种 “功能” 呢?因为要想实现像 Java 中那样的类,光靠一个 Scala 类可不行。在 Scala 中,我们必须:

    1. 定义一个 class 并在这里面实现所有的实例成员

    2. 添加一个 object ,这个 object 要与上面的 class 同名,然后在这里面实现所有的静态成员

    3. 定义的 class 与 object 必须在同一个文件内

    满足了上面 3 条要求以后,就可以实现类似 Java 中一个类既存在实例成员又存在静态成员的功能了。然后我们通常把第 2 步添加的 object 称为 “伴生对象” 。转化成代码,就像下面这样

    class CompanionDemo {
      
      println("new CompanionDemo clz")
      
      def init(): Unit = {
        // our codes...
      }
      
    }
    
    object CompanionDemo {
    
      println("new CompanionDemo object")
      
      def prt(): Unit = {
        // our codes...
      }
      
    }

    伴生对象有什么特点?

    毫无疑问,伴生对象这种存在最大的特点就是可以实现类似 Java 中那样,在同一个类里既有实例成员又有静态成员的功能。

    另一个特点就是 class CompanionDemo 和 object CompanionDemo 虽然分开两处定义,但却可以访问对方的 private 变量及方法。访问私有属性的一个小示例如下

    class CompanionDemo {
      
      private var clzi = 0
      
      def init(): Unit = {
        
        println("variable in clz:" + clzi)
        println("variable from object:" + CompanionDemo.obji)
        CompanionDemo.access(this)
        
      }
      
    }
    
    object CompanionDemo {
      
      private var obji = 1
      
      def access(clz: CompanionDemo): Unit = {
        
        println("variable in object:" + obji)
        println("variable from clz:" + clz.clzi)
        
      }
      
    }
    相互访问私有属性

    并通过如下代码来访问伴生对象

    object cpDemp {
      
      def main(args: Array[String]){
        
        val cd = new CompanionDemo()
        cd.init()
        
      }
      
    }

    执行结果如下

    variable in clz:0
    variable from object:1
    variable in object:1
    variable from clz:0
    如您所想的执行结果

    伴生对象中要想访问对方的私有属性,需要注意以下 2 点

    1. class 中要访问 object 中的私有属性,直接以 object 名来 “点” 相应的变量或方法即可,可以参考上面例子

    2. object 中要访问 class 中的私有属性,必须要通过 class 的对象引用来 “点” 相应变量或方法,可以参考上面例子

    伴生对象的意义是什么?

    Scala 中没有 static 关键字,而 Scala 又运行与 JVM 之上,与 Java 类库完全兼容的编程语言,同时类中拥有静态属性又是如此的有必要,因此推出这个伴生对象机制就显得很有必要了。所以第 1 个意义就是为了弥补类中不能定义 static 属性的缺陷

    那我们知道,在 Java 中静态属性是属于类的,在整个 JVM 中只开辟一块内存空间,这种设定使得静态属性可以很节省内存资源,不用担心像实例属性那样有内存溢出的风险。在 Scala 中伴生对象本质上也是生成静态属性,所以这第 2 个意义就是节省内存资源

    既然静态属性在整个 JVM 中仅开辟一块内存空间,那就说明我们可以在所有实例当中共享这块内存里面的信息,所以第 3 个意义就是资源共享


  • 相关阅读:
    一句话解释数字签名。一句话解释数字证书
    KVC、KVO实现过程
    SSH基本概念和用途
    UICollectionView左对齐流水布局、右对齐流水布局
    Git命令学习笔记
    Xcode8插件安装
    Xcode日常使用
    dispatch_group_t 日常使用注意事项
    二分查找变种
    maven插件调试方法
  • 原文地址:https://www.cnblogs.com/chorm590/p/scala_201904221054.html
Copyright © 2011-2022 走看看