`

Scala Companion Objects

 
阅读更多

原创转载请注明出处:http://agilestyle.iteye.com/blog/2333761

 

Scala跟踪感兴趣的对象的方式是默默地传递一个指向该对象的引用,这个引用可以用关键字this获取。可以显示地访问this,但是大多数时候并不需要访问它。

ObjectsAndMethods.scala

package org.fool.scala.companionobjects

class X(val n: Int) {
  def f = n * 10
  def fuc = this.n * 10
}

object ObjectsAndMethods extends App {
  val x1: X = new X(1)
  val x2: X = new X(2)

  println(x1.f)
  println(x2.f)
  println(x1.fuc)
  println(x2.fuc)
}

Console Output


 

Scala的object关键字定义了看起来大体上与类相同的事物,只是不能创建object任何实例,它是唯一的。object提供了一种方式,把在逻辑上彼此紧密关联但是无需多个实例的方法和域收集在一起。因此,永远不能创建它的任何实例,它只有一个实例,那就是它自己。

ObjectKeyword.scala

package org.fool.scala.companionobjects

object Y {
  val n = 2
  def f = n * 10
  def g = this.n * 20
}

object ObjectKeyword extends App {
  println(Y.n)
  println(Y.f)
  println(Y.g)
}

Console Output


 

object关键字允许创建类的伴随对象。普通对象和伴随对象的唯一差异就是后者的名字与常规类的名字相同,这就创建了伴随对象和它的类之间的关联,如果在伴随对象的内部创建一个域,那么不论创建多少个关联类的实例,都只会为该域产生单一的数据存储

ObjectField.scala

package org.fool.scala.companionobjects

class Z {
  def increment() = {
    Z.n += 1
    Z.n
  }
}

object Z {
  var n: Int = 0 // Only one of these
}

object ObjectField extends App {
  val z1 = new Z
  val z2 = new Z
  println(z1.increment())
  println(z2.increment())
  println(z1.increment())
}

Console Output

 

当一个方法只访问伴随对象的域时,将该方法移动到伴随对象中就变得很有意义了

ObjectMethods.scala

package org.fool.scala.companionobjects

class W

object W {
  var n: Int = 0

  def increment() = {
    n += 1
    n
  }

  def count() = increment()
}

object ObjectMethods extends App {
  println(W.increment())
  println(W.increment())
  println(W.count())
}

Console Output


 

伴随对象的用法:对每个实例计数,并在显示对象时显示该计数值。
ObjCounter.scala

package org.fool.scala.companionobjects

class Count() {
  val id: Int = Count.id()

  override def toString = s"Count($id)"
}

object Count {
  var n = -1

  def id() = {
    n += 1
    n
  }
}

object ObjCounter extends App {
  println(Vector(new Count, new Count, new Count, new Count, new Count))
}

Console Output


 

当伴随对象的名字后面有圆括号时(里面带有适合的参数),Scala就会调用apply,比如在创建case类时,不必使用new来创建该类的实例,因为创建case类时会自动创建包含特殊方法apply的伴随对象,该方法称为工厂方法

FactoryMethod.scala

package org.fool.scala.companionobjects

class Car(val make: String) {
  override def toString = s"Car($make)"
}

object Car {
  def apply(make: String) = new Car(make)
}

object FactoryMethod extends App {
  val car = Car("Porsche")
  println(car)
}

Console Output


 

参考资料:

Scala编程思想

 

 

 

 

  • 大小: 11 KB
  • 大小: 10.8 KB
  • 大小: 9 KB
  • 大小: 9.5 KB
  • 大小: 9 KB
  • 大小: 8.4 KB
分享到:
评论

相关推荐

    Programming Scala- Scalability = Functional Programming + Objects, 2 edition

    注意是Programming Scala的第二版,而不是Programming in Scala的第二版,更注重于与Spark相关的知识!强烈推荐!Programming Scala- Scalability = Functional Programming + Objects, 2 edition

    scala sdk scala-2.12.3

    Scala SDK,全称为Scala Software Development Kit,是用于开发Scala应用程序的核心工具集。Scala是一种多范式的编程语言,融合了面向对象和函数式编程的特点,它运行在Java虚拟机(JVM)上,能够充分利用Java生态...

    scala3 scala3 scala3 scala3 scala3

    Scala3,也被称为Scala 3或Dotty,是Scala编程语言的一个重大更新,旨在提高其简洁性、可读性和类型安全性。Scala3的发布标志着该语言的进一步成熟,它引入了一系列改进,旨在解决早期版本中的一些痛点,同时保持对...

    最好的scala学习 课件

    这部分还会讲解伴生对象(companion object)和隐式转换,这些特性使得Scala的面向对象设计更加灵活。 "Scala进阶之路-part04-Akka Actor.pdf"专注于Akka框架,这是Scala中用于构建分布式、容错系统的工具。Actor...

    scala深入学习

    例如,"Objects and Classes" 部分将会讲解类的定义、单例对象、伴生对象(companion objects)、case类以及模式匹配等概念。 4. 特质(Traits):特质在Scala中扮演着极其重要的角色,它们可以被看作是包含方法和...

    scala2.12.1Windows镜像包

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。这个"scala2.12.1Windows镜像包"是为Windows操作系统设计的Scala编程环境的安装包,版本号为2.12.1。Scala 2.12.x系列是其重要的一个稳定...

    scala-2.12.10.zip

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。这个"scala-2.12.10.zip"文件是Scala编程语言的特定版本——2.12.10,专为Windows操作系统设计的安装包。Scala 2.12.x系列是该语言的一个...

    scala + mybatis 数据库查询

    Scala是一种强大的多范式编程语言,它结合了面向对象和函数式编程的特性。MyBatis则是一款流行的Java持久层框架,主要用于简化数据库操作。在本项目中,"scala + mybatis 数据库查询",我们将探讨如何将Scala与...

    scala-2.12.10.tgz

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。Scala运行在Java虚拟机(JVM)上,并且可以充分利用Java的生态系统。`scala-2.12.10.tgz`是一个针对Linux操作系统的Scala安装包,它的版本号...

    scala实战高清讲解

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,使得它在处理并发和大数据分析方面表现出色。"Scala实战高清讲解"这本书是学习Scala的宝贵资源,尤其对于那些希望深入理解并提升Scala技能的...

    Scala语法简明教程

    ### Scala语法简明教程知识点详解 #### Scala语言简史 - **诞生历史**:Scala起源于瑞士联邦理工学院洛桑(EPFL),由Martin Odersky在2001年开始设计,其灵感来源于Funnel——一种结合了函数式编程思想与Petri网...

    Scala考试题1

    Scala 是一种多范式的编程语言,它融合了面向对象和函数式编程的特性。下面将详细解释题目中涉及的Scala知识点: 1. **var、val 和 def 的区别**: - `var` 定义可变变量,可以多次赋值。 - `val` 定义不可变变量...

    scala-2.11.8.rar

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性。这个"scala-2.11.8.rar"压缩包包含了Scala语言的2.11.8版本的源代码,这对于理解Scala的工作原理、学习高级编程技巧以及进行自定义扩展或...

    windows版scala-2.11.12.zip

    在这个"windows版scala-2.11.12.zip"压缩包中,包含的是Scala 2.11.12版本的Windows兼容安装文件,这是Scala的一个稳定版本,适用于开发人员在Windows操作系统上进行Scala编程。 Scala 2.11.x系列是Scala的一个主要...

    学习scala好的项目

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,被广泛应用于大数据处理、分布式计算和Web开发等领域。Spark是基于Scala构建的大数据处理框架,其高性能和易用性使得Scala在大数据领域备受...

    scala学习源代码

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性。这个"scala学习源代码"的压缩包文件很可能包含了用于教学或自我学习Scala编程的基础示例。让我们深入了解一下Scala语言的关键概念和特性。 ...

    scala-2.12.14.zip&scala-2.12.11.tgz Linux版本压缩包.rar

    Scala是一种强大的多范式编程语言,它融合了面向对象编程和函数式编程的概念,被广泛应用于大数据处理和分布式计算领域,特别是在Apache Spark等框架中。标题提到的"scala-2.12.14.zip&scala-2.12.11.tgz"是Scala的...

    scala-2.11.12 win msi 安装包

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。这个压缩包提供的文件是"scala-2.11.12 win msi 安装包",适用于Windows操作系统,版本号为2.11.12。这个版本的Scala是官方发布的,虽然原...

Global site tag (gtag.js) - Google Analytics