zoukankan      html  css  js  c++  java
  • Scala学习笔记之伴生对象

    所谓伴生对象, 也是一个Scala中的单例对象, 使用object关键字修饰。 除此之外, 还有一个使用class关键字定义的同名类, 这个类和单例对象存在于同一个文件中, 这个类就叫做这个单例对象的伴生类, 相对来说, 这个单例对象叫做伴生类的伴生对象。 举个栗子:
    object Companion {
    def show = println("I am a companion")
    }

    class Companion {
    def shout = Companion.show
    }(Companion.scala)

    这个object就是伴生对象,这和java中的Singleton异曲同工,实际上伴生对象本身就是一个Singleton,不同的是,它有一个与之同名的类(这里的class Companion),二者可以相互访问彼此的私有成员。
    编译一下:
    scalac Companion.scala

    同Singleton一样,我们也得到了两个文件:Companion.class和Companion$.class。我们还可以用javap查看反编译的结果,其中,Companion$.class与之前的Singleton$.class几近相同,这里就省略了。一起来看看Companion.class。
    javap Companion
    public class Companion extends java.lang.Object implements scala.ScalaObject{
    public static final void show();
    public Companion();
    public void shout();
    }

    因为有了对应的class,object成了伴生对象。从结果可以看出,伴生对象和它对应的类在字节码层面走到了一起(Companion类)。换句话说,在Scala里面的class和object在Java层面里面合二为一,class里面的成员成了实例成员,object成员成了static成员。我们已经知道,这里的static成员只是一个简单的wrapper,封装了实际的操作。

    对应到反编译的代码上,我们看到了与object相关的那个static方法——show。因为要构建Companion的实例,所以,生成的代码里有构造函数。此外,class Companion的实例方法shout在字节码层面上也体现到了Companion类里。

    至此,我们已经对伴生对象有了一个基本的了解。在Scala的层面上,我们把分属于类和实例分开放置,从代码的组织而言,会更加清晰。在实现层面上,它们都是按照对象处理的(分别用Companion$和Companion),从而达到了对象模型的统一。

  • 相关阅读:
    (创建型模式)Abstract Factory——抽象工厂模式
    (结构型模式)Composite——组合模式
    (行为模式)Command——命令模式
    (创建型模式)Singleton——单例模式
    Windows的Notepad++的插件
    Ubuntu的软件源更新常见问题及解决
    The following signatures were invalid: BADSIG 40976EAF437D05B5 Ubuntu Archive Automatic Signing Key
    Ubuntu安装ImageMagick
    常见误操作之警惕
    Rails3.2.x new project启动错误:Could not find a JavaScript runtime.
  • 原文地址:https://www.cnblogs.com/ChouYarn/p/4434084.html
Copyright © 2011-2022 走看看