zoukankan      html  css  js  c++  java
  • scala伴生对象,apply()及单例

    1:伴生对象与apply方法

    如果一个class与一个object具有相同的名字,那么我们就认为它们互为伴生。object为class的伴生对象。如下图所示,object Apply为class Apply的伴生对象。

    需要注意的小细节是,伴生对象的apply函数哪怕没有参数也需要加上一对”()”.

    class Apply {
      def apply = {
        println(" class apply")
      }
      
      def test = println("class test")
    }
    
    object Apply{
      def apply() = {//注意这里的apply()函数定义哪怕没有参数,也不能省略()
        println("object apply")
        new Apply
      }
      
    }
    
    object main_ extends App{
      val apply = Apply()
      apply.test
    }

    我们可以在伴生对象里实现apply函数,在函数里做一些事情,如果我们想要得到class对象的实例,而没有通过new的方式,那么它会先去执行该class的伴生对象的apply函数

    执行上述代码,结果:

    object apply

    class test

    可以看到,第一行代码得到一个apply对象,它首先执行了伴生对象的apply(),然后执行了class Apply的test(),可以表明它确实是一个class Apply对象。

    apply的应用:

    比如可以用来实现单例,需要两个步骤,一把class的构造设为private,二在class的伴生对象里实现apply函数,在这里返回class的对象。

    class Apply private {//构造函数私有化
      def apply = {
        println(" class apply")
      }
      
      def test = println("class test")
    }
    
    object Apply{
      val apply_i = new Apply()//伴生对象可以访问类的私有属性和函数
      def apply() = {//注意这里的apply()函数定义哪怕没有参数,也不能省略()
        println("object apply")
        apply_i
      }
      
    }
    
    object main_ extends App{
    //  val apply = Apply()
    //  apply.test
      
      for(i <- 0 until 10){
        val apply_i = Apply()
        println(apply_i)
      }
        
    }

    执行代码结果:

     

    可以看到均为同一对象。

  • 相关阅读:
    leetcode680
    leetcode558
    leetcode840
    leetcode703
    leetcode836
    leetcode704
    leetcode849
    leetcode707
    2019-10-26-Inno-Setup-安装包脚本-Run-的-Flags-标记
    2019-8-30-C#-从零开始写-SharpDx-应用-笔刷
  • 原文地址:https://www.cnblogs.com/eryuan/p/5063653.html
Copyright © 2011-2022 走看看