Scala編程問題集(01)

來源:互聯網
上載者:User

標籤: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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.