標籤:

Scala快速入門-6-單例對象及伴生對象

知識點

  • 用對象作為單例或存放工具方法,Scala沒有靜態方法或欄位
  • 類可以有一個同名的伴生對象
  • 對象的apply方法通常用來構造伴生類的新實例
  • Scala的main函數定義

單例對象

  • Scala沒有靜態方法或欄位,可以用object語法定義結構,對象定義了類的單個實例。
  • 對象的構造器在該對象第一次使用時被調用。
  • 不能提供構造器參數。
  • 作為存放工具函數或常量的地方。
  • 高效地共享單個不可變實例。

scala> object Accounts {n | private var lastNumber = 0n |n | def newUniqueNumber() = {n | lastNumber += 1n | lastNumbern | }n |n | }ndefined module Accountsnnscala>nnscala> Accounts.newUniqueNumber()nres2: Int = 1nnscala> Accounts.newUniqueNumber()nres3: Int = 2n

伴生對象

  • 在Scala中,可通過類和類同名的「伴生」對象來達到靜態方法的目的。
  • 類和它的伴生對象可以相互訪問私有特性,它們必須存在於同一個源文件中

apply方法

  • 一般在伴生對象中定義apply方法
  • 常用於初始化操作或創建單例對象
  • 在生成這個類的對象時,就省去了new關鍵字
  • 在遇到Object(參數1,參數2,……,參數n)時就會自動調用apply()方法

main函數

  • Scala程序必須從一個對象的main方法開始
  • 有兩種方法定義

// 執行println語句nobject Main {n def main(args: Array[String]): Unit = {n n println("=" * 10)nn }n}nn// 擴展App特質nobject Main extends App {n println("=" * 10)n}n

完事示例

class Account {nn val id = Account.newUniqueNumber()nn private var balance = 0.0nn def deposit(amount: Double): Double = {n balance += amountn balancen }nn def nowBalance = balance;nn}nnobject Account {n private var lastNumber = 0nn private def newUniqueNumber() = {n lastNumber += 1n lastNumbern }n}nnobject Main {n def main(args: Array[String]): Unit = {n val account = new Accountn println(Collaboration as a Service)n println(account.deposit(1))n println("=" * 10)nn val account1 = new Accountn println(account1.id)n println(account1.deposit(10))n println("=" * 10)nn println("a " + account.nowBalance + "; b " + account1.nowBalance)n }n}nn// ======= 執行結果nn1n1.0n==========n2n10.0n==========na 1.0; b 10.0nn// =================使用apply示例===================nnpackage com.gemantic.bigdatann/**n * @author Yezhiwein * @date 18/1/4n */nclass Student private (val sno: Int, val name: String){nn override def toString: String = {n "sno " + sno + " name " + namen }n}nnobject Student {n private var sno = 0nn private def newSno = {n sno += 1n snon }nnn def apply(name: String): Student = {nn println("call apply method...")n new Student(newSno, name)n }n}nnobject StudentMain extends App {n // no new n val student1 = Student("Yezhiwei")n println(student1.toString)nn println("*" * 10)n val student2 = Student("Yezhiwei")n println(student2.toString)n}nn// 運行結果nncall apply method...nsno 1 name Yezhiwein**********ncall apply method...nsno 2 name Yezhiwein

敬請期待下一篇~

作者:Yezhiwei

鏈接:Yezhiwei的博客 | Yezhiwei Blog

聲明:本文來源於網路,版權歸作者所有,轉載請註明,若有什麼問題,請聯繫我們,謝謝!

推薦閱讀:

究竟使用什麼語言去計算?
又是一道入群題(Scala)
Dotty 開發環境搭建
在 Dotty 中模擬 Kotlin (1) —— 標籤返回
如何評價 scala native?

TAG:Scala |