Kotlin的單例(Singleton)實現 [復制鏈接]

2019-11-1 10:19
小房子 閱讀:158 評論:0 贊:0
Tag:  Kotlin 單例 Singleton

Singleton:

Singleton是一種軟件設計模式,可以確保一個類僅具有一個實例,并且該類提供了對其的全局訪問點。單例模式可確保僅創建一個實例,并將其用作單個訪問點,從而確保線程安全。

在Java代碼中,它將如下所示:

public class Singleton {

private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}

但是以上代碼很危險,尤其是在不同線程中使用時。如果兩個線程一次訪問此單例,則可能生成該對象的兩個實例

class Singleton {
private static Singleton instance = null;
private Singleton() {
}
private synchronized static void createInstance() {
if (instance == null) {
instance = new Singleton();
}
}
public static Singleton getInstance() {
if (instance == null) createInstance();
return instance;
}
}

該synchronized關鍵字確保了創建實例時沒有線程的干擾。

如果您想在Kotlin中重新創建它,那么接近它的代碼將是:

class Singleton private constructor() {

private object HOLDER {
val INSTANCE = Singleton()
}
companion object {
val instance: Singleton by lazy { HOLDER.INSTANCE }
}
}

在這種情況下,The by lazy{}表示將僅在首次訪問時進行計算。lazy屬性的評估是synchronized,僅在一個線程中計算值,并且所有線程將看到相同的值。

Kotlin具有上述要求的默認實現,即

object Singleton

是啊!而已。只需一行代碼,您就可以避免所有這些代碼行。object是具有線程安全單例實現的數據類型。

對象聲明

object DataProviderManager {
fun registerDataProvider(provider: DataProvider) {
// ...
}
val allDataProviders: Collection<DataProvider>
get() = // ...
}

就像變量聲明一樣,對象聲明也不是表達式,并且不能在賦值語句的右側使用。對象聲明的初始化是線程安全的。

要引用該對象,我們直接使用其名稱。

DataProviderManager.registerDataProvider(...)

對象可以具有超類型:

object DefaultListener : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) { ... }
override fun mouseEntered(e: MouseEvent) { ... }
}

總結:

  • Kotlin對Singleton類的表示object僅需要關鍵字。
  • 一個object類可以包含屬性,函數和init方法。
  • 不允許使用構造方法。
  • 不能以實例化類的方式實例化對象。
  • 首次使用對象進行延遲初始化時,將實例化該對象。
  • Object 聲明的初始化是線程安全的。

我來說兩句
您需要登錄后才可以評論 登錄 | 立即注冊
facelist
所有評論(0)
領先的中文移動開發者社區
18620764416
7*24全天服務
意見反饋:[email protected]

掃一掃關注我們

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粵ICP備15117877號 )

安卓版28杠游戏