Android kotlin创建App实例
正常情况下,代码如下
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
instance = this
}
companion object {
private var instance: Application? = null
fun 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.KProperty
class NotNullSingleValueVar<T>() : ReadWriteProperty<Any?, T> {
private var value: T? = null
override 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) value
else throw IllegalStateException("already initialized ")
}
}
创建ext
import com.example.zanglidemo.utils.NotNullSingleValueVar
import kotlin.properties.ReadWriteProperty
object DelegatesExt {
fun <T> notNullSingleValue():
ReadWriteProperty<Any?, T> = NotNullSingleValueVar()
}
但是我们可以使用刚刚创建的委托,这样可以多一点保护。我们只能修改这个值一次:
companion object {
var instance: App by DelegatesExt.notNullSingleValue()
}
尽管,在这个例子中,使用单例可能是最简单的方法,但是我想用代码的形式展示给你怎么去创建一个自定义的委托