Android開發者必然都用過單例模式吧。
在處理一些在應用中只能存在一個實例的類的時候 我們時常會用單例模式。
通常單例
平時我們使用Java的時候,一個有效、安全的單例我們大概是這樣實現的:
//懶漢單例
public class Single {
private static Single ourInstance;
public static Single getInstance() {
if (null == ourInstance) {
createInstance();
}
return ourInstance;
}
private synchronized static void createInstance() {
if (ourInstance == null) {
ourInstance = new Single();
}
}
private Single() {
}
}
kotlin中有神奇的魔法,我們只需用object
來修飾此類,kotlin會自動為你實現一個安全的單例:
object Single
不禁感嘆一聲:如此簡潔、優雅
只需要考慮到對象不能有構造函數,因為我們不調用任何構造函數來訪問它們
而且只會在第一次被調用時生成實例
一個栗子:
/**
* 繼承BroadcastReceiver的一個單例
* Created by Song on 2017/9/1.
*/
object DemoSingle : BroadcastReceiver(){
//重寫父類方法
override fun onReceive(p0: Context?, p1: Intent?) {
}
//定義新方法
fun doSomeThing(p0 : String) {
Log.d("single", p0)
}
}
Application
Application 我們在開發時也經常將其作為一個單例來使用,但由于Android框架實例化類的方式。而我嘗試將它改寫為上面描述的單例的時候,程序啟動時就會拋出異常。
因此我們不得不使用伴生對象companion object
來實現這個偽單例
class MyKotlinApp : Application() {
companion object {
//標準委托,若在onCreate前調用此實例會直接拋出異常 IllegalStateException
// var instance: MyKotlinApp by Delegates.notNull()
//或者 這種方式不能處理基礎數據類型 int, float ,double等
lateinit var instance :MyKotlinApp
}
override fun onCreate() {
super.onCreate()
instance = this
}
}
此處又出現了伴生對象、標準委托、懶加載等知識點,且看稍后說明
伴生對象
其實大多嘗試過kotlin的coder都能在嘗試中看出來其作用,主要是代替靜態變量、靜態方法的一種寫法。
也確實如此,kotlin每個類都可以實現一個伴生對象,它是該類的所有實例共有的對象。它將類似于Java中的靜態字段。
懶加載
-
lateinit
表示這個屬性開始是沒有值得,但是,在使用前將被賦值(否則,就會拋出異常)。
使用限制:lateinit
不能用于修飾基礎類型(int、double等),且不能被賦值為null。 - 而
Delegates.notNull()
使用了標準委托中的非空委托,表示在使用這個字段時 如果該字段值為null則拋出異常IllegalStateException
關于標準委托,下次再和大家一起詳細了解。
感謝您的閱讀,若覺得對你有用,或者有疑問,歡迎聯系我。