單例
Kotlin中沒有static關(guān)鍵字,如果需要實(shí)現(xiàn)單例功能,
你可以使用關(guān)鍵字 object 聲明一個(gè)對(duì)象,對(duì)象的構(gòu)造器不能提供構(gòu)造器參數(shù);在第一次使用的時(shí)候會(huì)被初始化,可用于提供常量或共享不可變對(duì)象!具體可以仿照官網(wǎng)
單例模式是一種非常有用的模式,而 Kotlin(繼 Scala 之后)使單例聲明變得很容易:
object DataProviderManager {
fun registerDataProvider(provider: DataProvider) {
// ……
}
val allDataProviders: Collection<DataProvider>
get() = // ……
}
這稱為對(duì)象聲明。并且它總是在 object 關(guān)鍵字后跟一個(gè)名稱。 就像變量聲明一樣,對(duì)象聲明不是一個(gè)表達(dá)式,不能用在賦值語(yǔ)句的右邊。
要引用該對(duì)象,我們直接使用其名稱即可:
object DefaultListener : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) {
// ……
}
override fun mouseEntered(e: MouseEvent) {
// ……
}
}
注意:對(duì)象聲明不能在局部作用域(即直接嵌套在函數(shù)內(nèi)部),但是它們可以嵌套到其他對(duì)象聲明或非內(nèi)部類中。
不過我個(gè)人的習(xí)慣還是使用枚舉的方式
enum class Sington{
mSington;
fun usrSington(){}
}
伴生對(duì)象
對(duì)想我這樣剛接觸kotlin的java程序員來說,伴生對(duì)象是一個(gè)陌生的概念。這幾天也一直在轉(zhuǎn)變思想。我的理解是這樣的:
雖然kotlin為了更好的面向?qū)ο笕∠藄tatic關(guān)鍵字,但是有時(shí)我們也需要在class一級(jí)作出一個(gè)寫操作,因?yàn)榇嗽趉otlin中出現(xiàn)了companion
關(guān)鍵字。在
companion object{
......
}
數(shù)據(jù)塊中的屬性或者方法可以使用類.成員
的方式調(diào)用(調(diào)用方式和static成員一致),但是他們?cè)谶\(yùn)行時(shí)依然是實(shí)體的實(shí)例成員
class Singleton2 private constructor(){
companion object{
fun get(): Singleton2{
return Inner2.instance
}
}
private object Inner2{
val instance: Singleton2 = Singleton2()
}
}
如上面展示的那樣,我們使用伴生對(duì)象可以更好的和單例結(jié)合,這樣在調(diào)用單例的時(shí)候可以在我們想要獲得單例實(shí)例的時(shí)候再出初始化單例,保證了線程安全
objec,companion和const
剛開始學(xué)習(xí)kotlin的時(shí)候,可能會(huì)對(duì)companion object{}和const關(guān)鍵字弄混淆,這里我給出一點(diǎn)個(gè)人的理解:
- Kotlin用對(duì)象表達(dá)式和對(duì)象聲明實(shí)現(xiàn)Java匿名內(nèi)部類這種情況,即匿名類的實(shí)現(xiàn)對(duì)象為object。
- companion object{}伴生對(duì)象,雖然調(diào)用的時(shí)候類似static,但它依然是對(duì)象的實(shí)例成員,并且可以實(shí)現(xiàn)接口
-const 編譯時(shí)常量。1.String或基本類型進(jìn)行初始化;2.沒有自定義getter;3對(duì)象成員或頂級(jí)(Top-level)。從實(shí)際上看,它更符合static final的常量
靜態(tài)變量
如果你硬是要搞成Java中的靜態(tài)成員和靜態(tài)方法的話,你可以用:
靜態(tài)成員:
- @JvmField注解:生成與該屬性相同的靜態(tài)字段
- lateinit關(guān)鍵字:延遲初始化(沒用過)
- const()關(guān)鍵字:將 Kotlin 屬性轉(zhuǎn)換成 Java 中的靜態(tài)字段(定義常量用)
靜態(tài)方法:
- @JvmStatic注解:在單例對(duì)象和伴生對(duì)象中生成對(duì)應(yīng)的靜態(tài)方法
class StaticTest{
companion object{
const val s= ""
@JvmStatic fun test() = print(s)
}
}