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

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

    專注高端IT職業培訓

    親愛的猿猿,歡迎!

    已有賬號,請

    如尚未注冊?

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

    [復制鏈接]
    63 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咨詢馬上開啟

    色日日 - 色日日网集百万部多多潮流电影,酷酷小说,精彩图片,火辣