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

Posted by Yezhiwei on January 5, 2018

知识点

  • 用对象作为单例或存放工具方法,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

敬请期待下一篇~