溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

scala的單例對象是什么

發(fā)布時間:2021-12-08 15:04:01 來源:億速云 閱讀:108 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“scala的單例對象是什么”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

單例對象是一種特殊的類,有且只有一個實例。和惰性變量一樣,單例對象是延遲創(chuàng)建的,當它第一次被使用時創(chuàng)建。

當對象定義于頂層時(即沒有包含在其他類中),單例對象只有一個實例。

當對象定義在一個類或方法中時,單例對象表現(xiàn)得和惰性變量一樣。

一個單例對象是就是一個值。單例對象的定義方式很像類,但是使用關(guān)鍵字 object

object Box

下面例子中的單例對象包含一個方法:

package logging
object Logger {  def info(message: String): Unit = println(s"INFO: $message")}

方法 info 可以在程序中的任何地方被引用。像這樣創(chuàng)建功能性方法是單例對象的一種常見用法。

下面讓我們來看看如何在另外一個包中使用 info 方法:

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")  }

因為 import 語句 import logging.Logger.info,方法 info 在此處是可見的。

import語句要求被導入的標識具有一個“穩(wěn)定路徑”,一個單例對象由于全局唯一,所以具有穩(wěn)定路徑。

注意:如果一個 object 沒定義在頂層而是定義在另一個類或者單例對象中,那么這個單例對象和其他類普通成員一樣是“路徑相關(guān)的”。這意味著有兩種行為,class Milkclass OrangeJuice,一個類成員 object NutritionInfo “依賴”于包裝它的實例,要么是牛奶要么是橙汁。milk.NutritionInfo 則完全不同于oj.NutritionInfo。

伴生對象

當一個單例對象和某個類共享一個名稱時,這個單例對象稱為 伴生對象。同理,這個類被稱為是這個單例對象的伴生類。類和它的伴生對象可以互相訪問其私有成員。使用伴生對象來定義那些在伴生類中不依賴于實例化對象而存在的成員變量或者方法。

import scala.math._
case class Circle(radius: Double) {  import Circle._  def area: Double = calculateArea(radius)}
object Circle {  private def calculateArea(radius: Double): Double = Pi * pow(radius, 2.0)}
val circle1 = Circle(5.0)
circle1.area

這里的 class Circle 有一個成員 area 是和具體的實例化對象相關(guān)的,單例對象 object Circle 包含一個方法 calculateArea ,它在每一個實例化對象中都是可見的。

伴生對象也可以包含工廠方法:

class Email(val username: String, val domainName: String)
object Email {  def fromString(emailString: String): Option[Email] = {    emailString.split('@') match {      case Array(a, b) => Some(new Email(a, b))      case _ => None    }  }}
val scalaCenterEmail = Email.fromString("scala.center@epfl.ch")scalaCenterEmail match {  case Some(email) => println(    s"""Registered an email       |Username: ${email.username}       |Domain name: ${email.domainName}     """)  case None => println("Error: could not parse email")}

伴生對象 object Email 包含有一個工廠方法 fromString 用來根據(jù)一個 String 創(chuàng)建 Email 實例。在這里我們返回的是 Option[Email] 以防有語法分析錯誤。

注意:類和它的伴生對象必須定義在同一個源文件里。如果需要在 REPL 里定義類和其伴生對象,需要將它們定義在同一行或者進入 :paste 模式。

Java 程序員的注意事項

在 Java 中 static 成員對應于 Scala 中的伴生對象的普通成員。

在 Java 代碼中調(diào)用伴生對象時,伴生對象的成員會被定義成伴生類中的 static 成員。這稱為 靜態(tài)轉(zhuǎn)發(fā)。這種行為發(fā)生在當你自己沒有定義一個伴生類時。

“scala的單例對象是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI