本篇內(nèi)容介紹了“scala的單例對(duì)象是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
鹽田ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書(shū)銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書(shū)合作)期待與您的合作!
單例對(duì)象是一種特殊的類,有且只有一個(gè)實(shí)例。和惰性變量一樣,單例對(duì)象是延遲創(chuàng)建的,當(dāng)它第一次被使用時(shí)創(chuàng)建。
當(dāng)對(duì)象定義于頂層時(shí)(即沒(méi)有包含在其他類中),單例對(duì)象只有一個(gè)實(shí)例。
當(dāng)對(duì)象定義在一個(gè)類或方法中時(shí),單例對(duì)象表現(xiàn)得和惰性變量一樣。
一個(gè)單例對(duì)象是就是一個(gè)值。單例對(duì)象的定義方式很像類,但是使用關(guān)鍵字 object
:
object Box
下面例子中的單例對(duì)象包含一個(gè)方法:
package logging
object Logger {
def info(message: String): Unit = println(s"INFO: $message")
}
方法 info
可以在程序中的任何地方被引用。像這樣創(chuàng)建功能性方法是單例對(duì)象的一種常見(jiàn)用法。
下面讓我們來(lái)看看如何在另外一個(gè)包中使用 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")
}
因?yàn)?import 語(yǔ)句 import logging.Logger.info
,方法 info
在此處是可見(jiàn)的。
import語(yǔ)句要求被導(dǎo)入的標(biāo)識(shí)具有一個(gè)“穩(wěn)定路徑”,一個(gè)單例對(duì)象由于全局唯一,所以具有穩(wěn)定路徑。
注意:如果一個(gè) object
沒(méi)定義在頂層而是定義在另一個(gè)類或者單例對(duì)象中,那么這個(gè)單例對(duì)象和其他類普通成員一樣是“路徑相關(guān)的”。這意味著有兩種行為,class Milk
和 class OrangeJuice
,一個(gè)類成員 object NutritionInfo
“依賴”于包裝它的實(shí)例,要么是牛奶要么是橙汁。milk.NutritionInfo
則完全不同于oj.NutritionInfo
。
當(dāng)一個(gè)單例對(duì)象和某個(gè)類共享一個(gè)名稱時(shí),這個(gè)單例對(duì)象稱為 伴生對(duì)象。同理,這個(gè)類被稱為是這個(gè)單例對(duì)象的伴生類。類和它的伴生對(duì)象可以互相訪問(wèn)其私有成員。使用伴生對(duì)象來(lái)定義那些在伴生類中不依賴于實(shí)例化對(duì)象而存在的成員變量或者方法。
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
有一個(gè)成員 area
是和具體的實(shí)例化對(duì)象相關(guān)的,單例對(duì)象 object Circle
包含一個(gè)方法 calculateArea
,它在每一個(gè)實(shí)例化對(duì)象中都是可見(jiàn)的。
伴生對(duì)象也可以包含工廠方法:
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")
}
伴生對(duì)象 object Email
包含有一個(gè)工廠方法 fromString
用來(lái)根據(jù)一個(gè) String 創(chuàng)建 Email
實(shí)例。在這里我們返回的是 Option[Email]
以防有語(yǔ)法分析錯(cuò)誤。
注意:類和它的伴生對(duì)象必須定義在同一個(gè)源文件里。如果需要在 REPL 里定義類和其伴生對(duì)象,需要將它們定義在同一行或者進(jìn)入 :paste
模式。
在 Java 中 static
成員對(duì)應(yīng)于 Scala 中的伴生對(duì)象的普通成員。
在 Java 代碼中調(diào)用伴生對(duì)象時(shí),伴生對(duì)象的成員會(huì)被定義成伴生類中的 static
成員。這稱為 靜態(tài)轉(zhuǎn)發(fā)。這種行為發(fā)生在當(dāng)你自己沒(méi)有定義一個(gè)伴生類時(shí)。
“scala的單例對(duì)象是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!