Android kotlin创建App实例

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()
}

尽管,在这个例子中,使用单例可能是最简单的方法,但是我想用代码的形式展示给你怎么去创建一个自定义的委托

相关推荐
ejinxian6 分钟前
PHP 超文本预处理器 发布 8.5 版本
开发语言·php
福柯柯13 分钟前
Android ContentProvider的使用
android·contenprovider
不想迷路的小男孩13 分钟前
Android Studio 中Palette跟Component Tree面板消失怎么恢复正常
android·ide·android studio
餐桌上的王子14 分钟前
Android 构建可管理生命周期的应用(一)
android
菠萝加点糖18 分钟前
Android Camera2 + OpenGL离屏渲染示例
android·opengl·camera
用户20187928316729 分钟前
🌟 童话:四大Context徽章诞生记
android
软件黑马王子33 分钟前
C#系统学习第八章——字符串
开发语言·学习·c#
阿蒙Amon34 分钟前
C#读写文件:多种方式详解
开发语言·数据库·c#
yzpyzp37 分钟前
Android studio在点击运行按钮时执行过程中输出的compileDebugKotlin 这个任务是由gradle执行的吗
android·gradle·android studio
Da_秀42 分钟前
软件工程中耦合度
开发语言·后端·架构·软件工程