標籤:scala bigdata 大數據 spark
Scala編程問題集(01)
By 高煥堂
洞庭國際智能硬體檢測基地
Q-01: 如何使用Scala的Singleton機制來表達Class-level的資料。
Answer:
在物件導向編程(OOP,Object-Oriented Programming)概念裡,屬性(Attribute)和函數(Function)都分為兩個不同層級(Level)。例如,廈門的科技穀(廈門)公司的大資料平台上,定義了數百個航空公司的類(Class),包括:東方航空公司(ChinaEasternAirlines)、南方航空公司(ChinaEasternAirlines)、長榮航空公司(EvergreenAirlines)等等。其中,每一架飛機都是一個執行個體(Instance)或稱對象(Object)。於是可看出來,無論屬性或函數都分為兩個層級:
-
Instance-level(執行個體層級或稱對象層級):這是一般大家都知道的,例如每一架飛機都是一個執行個體或對象,各自都有它的廠牌、載客量、年齡等屬性資料。
-
Class-level(類層級):例如,長榮航空公司的飛機數量,是重要的屬性資料,但不是某一架飛機(Instance)的屬性資料,而是屬於整個EvergreenAirlines類的屬性資料。當我們再問:長榮航空公司的飛機數量時,常常相當於在問:EVA(EvergreenAirlines)類目前共建立了多少個對象(執行個體)呢?像這種資料,就稱為Class-level的屬性資料。
既然有了Class-level的屬性,為了存取(Access)這種屬性的資料值(Value),當然我們就會定義某些函數來存取或處理之。這種函數,就稱為Class-level的函數或方法了。
// Instance-level 屬性和函數的定義
class EVA {
var manufacturer : String = ""
var capacity : Int = 0
var mfr_date : String = ""
def pr_capacity() {
println(capacity)
}
}
// Class-level 屬性和函數的定義
object EVA {
var instance_amount : Int = 0
def apply() {
instance_amount = instance_amount + 1
return new EVA
}
def pr_amt() {
println(instance_amount)
}
}
// myApp
object myApp {
def main( args: Array[String] ) {
val a1 = EVA()
val a2 = EVA()
val a3 = EVA()
EVA.pr_amt
}
其中的capacity是Instance-level屬性,pr_capacity是Instance-level函數。而instance_amt是Class-level屬性,而pr_amt是Class-level函數。在執行這個程式時,首先載入(Load)代碼到記憶體(Memory),讓VM來執行之。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/55/46/wKiom1SJWqqwtmynAABaRwW2lHE002.jpg" title="aa01.png" alt="wKiom1SJWqqwtmynAABaRwW2lHE002.jpg" />
當執行到指令: val a1 = EVA(),此時先執行等號(=)右邊的EVA(),拿object EVA定義來建立一個對象,來表達EVA類本身,也就是說,EVA類本身就是一個對象,所以就建立一個VEA類的對象,來儲存EVA類有關的屬性(資料)值。例如,定義一個instance_amt屬性來紀錄目前EVA類共建立了多少個對象(長榮航空有多少架飛機)。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/55/46/wKiom1SJWs2Sd89-AAB8z2s0bkI963.jpg" title="aa02.png" alt="wKiom1SJWs2Sd89-AAB8z2s0bkI963.jpg" />
接著執行到apply()函數,拿class EVA定義來建立一個對象,來表達一架長榮飛機,記錄該架飛機的屬性值。並且,將EVAobj的instance_amt值加1,表是長榮航空增加了一架飛機。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/55/43/wKioL1SJW46QB1KcAACYoZ3XiRM435.jpg" title="aa03.png" alt="wKioL1SJW46QB1KcAACYoZ3XiRM435.jpg" />
繼續執行到:
val a2 = EVA()
val a3 = EVA()
就建立更多的<長榮飛機>對象,並更新了<長榮飛機類>對象裡的instance_amt值。650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/55/46/wKiom1SJWzLRIE78AADB9j122C0267.jpg" title="aa04.png" alt="wKiom1SJWzLRIE78AADB9j122C0267.jpg" />
此時,在記憶體裡共有4個對象,包括1個<EVA類>(本身的)對象,以及3個<EVA執行個體>對象(如裡的a1, a2和a3)。以上,藉由長榮航空的例子,說明Scala語言如何表達Instance-level屬性和函數,以及表達Class-level屬性和函數。
~ end ~
Scala編程問題集(01)