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

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

相关推荐
小比卡丘2 分钟前
【C++初阶】第15课—模版进阶
android·java·c++
"_rainbow_"6 小时前
C++常用函数合集
开发语言·c++·算法
满怀10157 小时前
【Python进阶】正则表达式实战指南:从基础到高阶应用
开发语言·python·正则表达式
加点油。。。。8 小时前
C语言高频面试题目——内联函数和普通函数的区别
c语言·开发语言·面试
muyouking118 小时前
5.Rust+Axum:打造高效错误处理与响应转换机制
开发语言·后端·rust
songroom8 小时前
Rust: 从内存地址信息看内存布局
开发语言·后端·rust
听雨·眠8 小时前
go中map和slice非线程安全
java·开发语言·golang
FAREWELL000758 小时前
C#进阶学习(十)更加安全的委托——事件以及匿名函数与Lambda表达式和闭包的介绍
开发语言·学习·c#·事件·lambda表达式·匿名函数·闭包
酷ku的森9 小时前
4.LinkedList的模拟实现:
java·开发语言
264玫瑰资源库9 小时前
嘻游电玩三端客户端部署实战:PC + Android + iOS 环境全覆盖教程
android·ios