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)
      }
        
    }

    执行代码结果:

     

    可以看到均为同一对象。

  • 相关阅读:
    NYOJ 10 skiing DFS+DP
    51nod 1270 数组的最大代价
    HDU 4635 Strongly connected
    HDU 4612 Warm up
    POJ 3177 Redundant Paths
    HDU 1629 迷宫城堡
    uva 796
    uva 315
    POJ 3180 The Cow Prom
    POJ 1236 Network of Schools
  • 原文地址:https://www.cnblogs.com/eryuan/p/5063653.html
Copyright © 2011-2022 走看看