kotlinApp_0">Android kotlin创建App实例
正常情况下,代码如下
class MyApp : Application() {override fun onCreate() {super.onCreate()instance = this}companion object {private var instance: Application? = nullfun instance() = instance!!}
}
在这个情景下,委托就可以帮助我们了。我们直到我们的单例不会是null,但是我们不能使用构造函数去初始化属性。所以我们可以使用 notNull 委托:
class MyApp : Application() {companion object {var instance: MyApp by Delegates.notNull()}override fun onCreate() {super.onCreate()instance = this}
}
这种情况下有个问题,我们可以在app的任何地方去修改这个值,因为如果我们使用 Delegates.notNull() ,属性必须是var的。
创建自定义委托
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KPropertyclass NotNullSingleValueVar<T>() : ReadWriteProperty<Any?, T> {private var value: T? = nulloverride fun getValue(thisRef: Any?, property: KProperty<*>): T {return value ?: throw IllegalStateException("not initialized")}override fun setValue(thisRef: Any?, property: KProperty<*>,value: T) {this.value = if (this.value == null) valueelse throw IllegalStateException("already initialized ")}
}
创建ext
import com.example.zanglidemo.utils.NotNullSingleValueVar
import kotlin.properties.ReadWritePropertyobject DelegatesExt {fun <T> notNullSingleValue():ReadWriteProperty<Any?, T> = NotNullSingleValueVar()
}
但是我们可以使用刚刚创建的委托,这样可以多一点保护。我们只能修改这个值一次:
companion object {var instance: App by DelegatesExt.notNullSingleValue()
}
尽管,在这个例子中,使用单例可能是最简单的方法,但是我想用代码的形式展示给你怎么去创建一个自定义的委托