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

}

执行代码结果:

可以看到均为同一对象。

时间: 2024-08-24 11:39:24

scala伴生对象,apply()及单例的相关文章

Scala伴生对象

Scala伴生对象 大部分Scala的单例对象不是单独存在的,而是同时存在相同名称的类.此时这个单例对象是"类"的伴生对象,而类则是"单例对象"的伴生类.类与它的伴生对象必须在同一个资源文件内. 例如: case class NumberPair(num1: Int, num2: Int) case class Sum(sumResult: Int) object NumberPair {  implicit def add: NumberPair => Su

Scala 伴生对象

转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://www.blogbus.com/dreamhead-logs/60217908.html 准备涉水Scala的Java程序员请注意,Scala里没有static. 在大多数情况下,static真不该是static的.像Scala这样想在面向对象上更进一步的程序设计语言,取消static是一种进取的表现,这样得以保证了其面向对象模型的完整性.好吧,我承认,??有时候,我们还是需要类一级的属性和操作的.在Scala里,我们还是有机

scala 单例、伴生对象、伴生类

单例:使得对象成为系统中的唯一实例 package scala object single { private var sno:Int = 3; def singlesno()={ sno += 1 sno } } object singleTest { def main(args: Array[String]): Unit = { println(single.singlesno()) println(single.singlesno()) } } 伴生对象: 当单例对象与某个类共享同一个名称

010-Scala单例对象、伴生对象实战详解

010-Scala单例对象.伴生对象实战详解 Scala单例对象详解 函数的最后一行是返回值 子项目 Scala伴生对象代码实战 object对象的私有成员可以直接被class伴生类访问,但是不可以被其他的类或者对象访问 伴生类访问伴生对象的成员时,要通过名称.成员来访问 调用一些元素的方法初始化创建的时候,例如:Array(1,2,,34,5,6)其实调用了它的apply()方法 欢迎广大爱好者学习交流.也欢迎广大学习爱好者加入 DT大数据梦工厂交流群:462923555 DT大数据微信公众账

Scala学习 -- 单例对象

Scala 比 Java 更面向对象一点,是 Scala 的类不允许静态(static)成员.对此类使用场景,Scala 提供了 单例对象(object).单例对象的定义看上去跟类定义很像,只不过 class 关键字被换成了 object 关键字. 在事例中单例对象名叫 ChecksumAccumulator, 跟前一个例子中的类名一样. 当单例对象跟某个类公用同一个名字时,它被称作这个类的 伴生对象(companion object). 必须在同一个源码文件中定义的类和类的伴生对象.同时,类又

scala中的伴生对象实现原理

孤立对象是只有一个object关键字修饰的对象. 该对象会编译成两个class文件, 一个是以孤立对象的名字命名的class,  一个是以孤立对象的名字后面加上一个$字符命名的class, 这个class又叫做虚构类. 源码中的孤立对象中的字段和方法, 都被编译成以孤立对象的名字命名的class中的静态方法, 这些静态方法都会访问单例的虚构类对象. 虚构了是传统意义上的单例模式, 并且在类初始化的时候有, 就会创建唯一的对象. 源码中的所有字段和方法都会在虚构类中有相对应的成员. 如果不明白的可

快学Scala 第九课 (伴生对象和枚举)

Scala没有静态方法和静态字段, 你可以用object这个语法结构来达到同样的目的. 对象的构造器只有在第一次被使用时才调用. 伴生对象apply方法: 类和它的伴生对象可以互相访问私有特性,他们必须存在于同一个源文件. 类中要访问类的伴生对象中成员,需要通过类.成员调用. class Account private (val id: Int, initialBalance: Double){ } object Account { def apply(initialBalance: Doubl

聊聊 Scala 的伴生对象及其意义

2019-04-22 关键字:Scala 伴生对象的作用 关于 Scala 伴生对象,比教材更详细的解释. 什么是伴生对象? 教材中关于伴生对象的解释是:实现类似 Java 中那种既有实例成员又有静态成员的类的功能. 为什么上面说它是一种 "功能" 呢?因为要想实现像 Java 中那样的类,光靠一个 Scala 类可不行.在 Scala 中,我们必须: 1. 定义一个 class 并在这里面实现所有的实例成员. 2. 添加一个 object ,这个 object 要与上面的 class

Spring单例Bean中注入多例Bean

问题: 当在一个单例Bean中注入一个多例Bean的时候,是获取不到那个多例对象的,因为,单例在初始化的时候,就直接初始化,这个多例Bean啦, 一直获取的是第一次初始化的Bean 配置文件: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="htt