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 |