• <dd id="wpirm"><center id="wpirm"></center></dd>

      <button id="wpirm"><acronym id="wpirm"></acronym></button>
      <s id="wpirm"><acronym id="wpirm"></acronym></s>

      好程序員-千鋒教育旗下高端IT職業教育品牌

      400-811-9990
      我的賬戶
      好程序員

      專注高端IT職業培訓

      親愛的猿猿,歡迎!

      已有賬號,請

      如尚未注冊?

      [BigData] 好程序員大數據培訓分享Scala系列之對象

      [復制鏈接]
      141 0
      葉子老師 發表于 2019-9-29 11:36:49 | 只看該作者 |閱讀模式 打印 上一主題 下一主題
      好程序員大數據培訓分享Scala系列之對象
      1. 單例對象
      Scala中沒有靜態方法和靜態字段,但是可以使用object這個語法結構來達到同樣的目的
      1.scala類似于Java中的工具類,可以用來存放工具函數和常量
      2.高效共享單個不可變的實例
      3.單例模式
      單例對象雖然類似于Java中的工具類,但它不是,還是一個對象,可以把單例對象名看做一個貼在對象上的標簽。
      package logging
      //使用關鍵字object定義單例對象
      object Logger {
        def info(message: String): Unit = println(s"INFO: $message")
      }
      單例對象的使用
      //導入單例對象信息,使之在當前類可見
      import logging.Logger.info

      class Project(name: String, daysToComplete: Int)

      class Test {
        val project1 = new Project("TPS Reports", 1)
        val project2 = new Project("Website redesign", 5)
          //調用單例對象中定義的方法
        info("Created projects")  // Prints "INFO: Created projects"
      }
      類和單例對象的區別是,單例對象不能帶參數,單例對象不能用new關鍵字實例化,所以沒有機會傳遞給它實例化的參數。
      單例對象在第一次訪問的時候才會初始化。
      當單例對象與某個類同名時,它被稱為類的伴生對象,類和伴生對象必須定義在一個源文件里,類稱為該單例對象的伴生類,類和他的伴生對象可以互相訪問其私有成員。
      不與伴生類共享名稱的單例對象被稱為獨立對象,可以作為相關功能的工具類,或者scala應用程序的入口點。
      2. 伴生對象
      Scala的類中,與類名相同并且用object修飾的對象叫做伴生對象,類和伴生對象之間可以相互訪問私有的方法和屬性,他們必須存在同一個源文件中
      class AccountInfo {
      //類的伴生對象的功能特性并不在類的作用域
      //所以不能直接用newUniqueNumber()調用伴生對象的方法
      var id = AccountInfo.newUniqueNumber()
      }

      object  AccountInfo {
        private var lastNumber = 0
        private def newUniqueNumber() = {
          lastNumber += 1; lastNumber
        }

        def main(args: Array[String]) {
        //相當于Java中的靜態方法調用
          println(AccountInfo.newUniqueNumber())
        }

      }
      3. apply方法
      通常我們會在類的伴生對象中定義apply方法,當遇到類名(參數1,...參數n)時apply方法會被調用
      class AccountInfo {

      }

      object  AccountInfo {
        private var lastNumber = 0
        private def apply(arg :Int) = {
          lastNumber = arg*2 + 1; lastNumber
        }

        def main(args: Array[String]) {
          println(AccountInfo(1))
        }

      }
      4. 應用程序對象
      Scala程序都必須從一個對象的main方法開始,可以通過擴展App特質,不寫main方法。
      object Hello extends  App{
        println("Hello World")
      }
      object Hello {

        def main(args: Array[String]): Unit = {
          println("Hello World")
        }

      }
      5.提取器
      帶有unapply方法的對象,經常用在模式匹配或者偏函數中。
      import scala.util.Random

      object CustomerID {

        def apply(name: String) = s"$name--${Random.nextLong}"

        def unapply(customerID: String): Option[String] = {
          val name = customerID.split("--").head
          if (name.nonEmpty) Some(name) else None
        }
      }
      //調用apply方法創建一個對象,等價于CustomerID.apply("Sukyoung")
      val customer1ID = CustomerID("Sukyoung")  // Sukyoung--23098234908
      customer1ID match {
          //調用unapply方法,提取name信息
        case CustomerID(name) => println(name)  // prints Sukyoung
        case _ => println("Could not extract a CustomerID")
      }

      精彩內容,一鍵分享給更多人!
      收藏
      收藏0
      轉播
      轉播
      分享
      淘帖0
      支持
      支持0
      反對
      反對0
      回復

      使用道具 舉報

      您需要登錄后才可以回帖

      本版積分規則

      關注我們
      好程序員
      千鋒好程序員

      北京校區(總部):北京市海淀區寶盛北里西區28號中關村智誠科創大廈

      深圳西部硅谷校區:深圳市寶安區寶安大道5010號深圳西部硅谷B座A區605-619

      杭州龍馳智慧谷校區:浙江省杭州市下沙經濟技術開發區元成路199號龍馳智慧谷B座7層

      鄭州校區:鄭州市二七區航海中路60號海為科技園C區10層、12層

      Copyright 2007-2019 北京千鋒互聯科技有限公司 .All Right

      京ICP備12003911號-5 京公安網11010802011455號

      請您保持通訊暢通1對1咨詢馬上開啟

      Pictoa