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

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

相关推荐
z落落4 小时前
C# 泛型方法(原理、类型推断、多泛型参数)+泛型效率(普通类型 VS Object装箱 VS 泛型)
开发语言·c#
L_09074 小时前
【C++】异常
开发语言·c++
世辰辰辰5 小时前
批量修改图片/文本名子
开发语言·python·批量修改文件名
z落落7 小时前
C# 四种特殊类:抽象类、密封类、静态类、部分类
开发语言·c#
VidDown7 小时前
Webhook 调试器:让第三方回调“原形毕露”
java·开发语言·javascript·编辑器·postman
装不满的克莱因瓶8 小时前
基于 OpenResty 扩展开发实现动态服务注册与发现能力
java·开发语言·架构·openresty
weixin_523185328 小时前
Java基础知识总结(四):引用数据类型与参数传递机制
java·开发语言·python
Nayxxu8 小时前
Claude API 生产稳定性设计:超时、降级、备用模型和告警怎么做
开发语言·php
王cb8 小时前
WinRT Server and Client c#
开发语言·c#
Selina K9 小时前
C中日历时间转换
c语言·开发语言