Scala快速入门-6-单例对象及伴生对象

简介: • 用对象作为单例或存放工具方法,Scala没有静态方法或字段• 类可以有一个同名的伴生对象• 对象的apply方法通常用来构造伴生类的新实例• Scala的main函数定义单例对象

知识点


  • 用对象作为单例或存放工具方法,Scala没有静态方法或字段
  • 类可以有一个同名的伴生对象
  • 对象的apply方法通常用来构造伴生类的新实例
  • Scala的main函数定义

单例对象


  • Scala没有静态方法或字段,可以用object语法定义结构,对象定义了类的单个实例。
  • 对象的构造器在该对象第一次使用时被调用。
  • 不能提供构造器参数。
  • 作为存放工具函数或常量的地方。
  • 高效地共享单个不可变实例。
scala> object Accounts {
     | private var lastNumber = 0
     |
     | def newUniqueNumber() = {
     | lastNumber += 1
     | lastNumber
     | }
     |
     | }
defined module Accounts
scala>
scala> Accounts.newUniqueNumber()
res2: Int = 1
scala> Accounts.newUniqueNumber()
res3: Int = 2

伴生对象


  • 在Scala中,可通过类和类同名的“伴生”对象来达到静态方法的目的。
  • 类和它的伴生对象可以相互访问私有特性,它们必须存在于同一个源文件中

apply方法


  • 一般在伴生对象中定义apply方法
  • 常用于初始化操作或创建单例对象
  • 在生成这个类的对象时,就省去了new关键字
  • 在遇到Object(参数1,参数2,......,参数n)时就会自动调用apply()方法

main函数


  • Scala程序必须从一个对象的main方法开始
  • 有两种方法定义
// 执行println语句
object Main {
  def main(args: Array[String]): Unit = {
    println("=" * 10)
  }
}
// 扩展App特质
object Main extends App {
  println("=" * 10)
}

完事示例


class Account {
  val id = Account.newUniqueNumber()
  private var balance = 0.0
  def deposit(amount: Double): Double = {
    balance += amount
    balance
  }
  def nowBalance = balance;
}
object Account {
  private var lastNumber = 0
  private def newUniqueNumber() = {
    lastNumber += 1
    lastNumber
  }
}
object Main {
  def main(args: Array[String]): Unit = {
    val account = new Account
    println(account.id)
    println(account.deposit(1))
    println("=" * 10)
    val account1 = new Account
    println(account1.id)
    println(account1.deposit(10))
    println("=" * 10)
    println("a " + account.nowBalance + "; b " + account1.nowBalance)
  }
}
// ======= 执行结果
1
1.0
==========
2
10.0
==========
a 1.0; b 10.0
// =================使用apply示例===================
package com.gemantic.bigdata
/**
  * @author Yezhiwei
  * @date 18/1/4
  */
class Student private (val sno: Int, val name: String){
  override def toString: String = {
    "sno " + sno + " name " + name
  }
}
object Student {
  private var sno = 0
  private def newSno = {
    sno += 1
    sno
  }
  def apply(name: String): Student = {
    println("call apply method...")
    new Student(newSno, name)
  }
}
object StudentMain extends App {
  // no new 
  val student1 = Student("Yezhiwei")
  println(student1.toString)
  println("*" * 10)
  val student2 = Student("Yezhiwei")
  println(student2.toString)
}
// 运行结果
call apply method...
sno 1 name Yezhiwei
**********
call apply method...
sno 2 name Yezhiwei
相关文章
|
5月前
|
Scala
164 Scala 对象
164 Scala 对象
16 0
|
7月前
|
消息中间件 Java 大数据
Scala快速入门
Scala快速入门
75 0
Scala快速入门-11-常用集合操作
所有的集合都扩展自Iterable特质 集合有三大类,分别为序列、集和映射 几乎所有集合类,Scala都同时提供了可变和不可变的版本 Scala列表要么是空的,要么拥有一头一尾,其中尾部本身又是一个表列 集是无先后次序的集合 用LinkedHashSet来保留插入顺序,或用SortedSet来按顺序进行迭代 +将元素添加到无先后次序的集合中;+:和:+向前或向后追加到序列;++将两个集合串接在一起;-和--移除元素 映射、折叠和拉链操作是很有用的技巧,用来将函数和操作应用到集合中的元素
|
安全 Java 编译器
Scala快速入门-10-模式匹配与样例类
mathch表达式是一个更好的switch,不会有穿透到下一个分支的问题 如果没有模式能够匹配,会抛出MatchError,可以用case _ 模式来避免,相当于Java中的default 模式可以包含一个随意定义的条件,称做守卫 可以匹配数组、列表、元组等模式,然后将匹配到不同部分绑定到变量 样例类及密封类的模式匹配 用Option来存放可能存在也可能不存在的值,比null更安全
Scala快速入门-9-高阶函数
作为值的函数 创建匿名函数 带函数参数的函数 闭包 柯里化
|
Java Scala
Scala快速入门-8-特质
Scala和Java一样不允许类继承多个超类,特质解决这一局限性 类可以实现任意数量的特质 当将多个特质叠加在一起时,顺序很重要,其方法先被执行的特质排在更后面 Scala特质可以提供方法和字段的实现 特质要求实现它们的类具备特定的字段、方法或超类 特质可以同时拥有抽象方法和具体方法,而类可以实现多个特质
|
Java Scala
Scala快速入门-7-继承
继承类 extends 重写方法时必须用override 只有主构造器可以调用超类的主构造器 重写字段 抽象类、字段
|
Java Scala
Scala快速入门-5-类定义
每个类都有一个主构造器,这个构造器和类的定义“交织”在一起,它的参数直接成为类的字段,主构造器执行类体中所有的语句 类中的字段自动带getter和setter方法 用@BeanProperty注解生成JavaBean的getXxx/setXxx方法 辅助构造器是可选的,它们都叫做this
Scala快速入门-4-常用映射和元组操作
映射是键值对的集合 n个对象(并不一定要相同类型的对象)的集合,元组
|
Java Scala
Scala快速入门-3-常用数组操作
长度固定使用Array,长度有变化使用ArrayBuffer 提供初始值时不要使用new 用()来访问元素 for(elem <- arr)遍历元素 for(elem <- arr if ...) yield ...将原数组转为新数组