Kotlin让属性只能被赋值一次且不能为空

原创 2017年06月15日 12:01:33

有时候要求一个属性只能赋值一次,且不能为空,可以用下面的方法

本文地址: http://blog.csdn.net/qq_25806863/article/details/73277876

用get和set

利用属性的get()和set()对值进行控制:

class APP : Application() {
    companion object {
        var app: Application? = null
            set(value) {
                field = if (field == null&& value!=null) value else throw  IllegalStateException("不能设置为null,或已经有了")
            }
            get() {
                return field ?: throw IllegalStateException("还没有被赋值")
            }
    }
    override fun onCreate() {
        super.onCreate()
        app = this
    }
}

用委托实现

自定义一个委托属性:

class NotNUllSingleVar<T> : ReadWriteProperty<Any?, T> {
    private var value: T? = null
    override fun getValue(thisRef: Any?, property: KProperty<*>): T {
        return value ?: throw IllegalStateException("还没有被赋值")
    }
    override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
        this.value = if (this.value == null&&value!=null) value else throw IllegalStateException("不能设置为null,或已经有了")
    }
}

然后对属性使用就行了:

class APP : Application() {
    companion object {
        var app: Application? by NotNUllSingleVar()
    }
    override fun onCreate() {
        super.onCreate()
        app = this
    }
}

这样所有需要实现这个需求的属性都可以用这个委托来实现。

Kotlin-属性

声明属性对于类而言,属性必然是不可缺少的。在Kotlin中,属性值由var和val关键字声明,其中,var声明的属性值为可变的,而val声明的属性值是只读属性,也就是说其值是不可变的。class Pe...

Fragment使用小结

→Fragment是从安卓的3.0开始有的,主要针对大屏幕的设备进行工作(例如平板)。     →Fragment中文翻译“片段,碎片”,他确实是做为活动一个片段来存在的,你可以将他理解为一个模块,或...

Android 获取屏幕宽高的几种方式

获取手机宽高的方法,亲测可用。

Kotlin的属性委托:无上下文情况下Android的赋值(KAD 15)

作者:Antonio Leiva 时间:Mar 9, 2017 原文链接:https://antonioleiva.com/property-delegation-kotlin/     ...
  • worisaa
  • worisaa
  • 2017年03月17日 12:54
  • 268

Kotlin的属性委托:无上下文情况下Android的赋值(KAD 15)

作者:Antonio Leiva 时间:Mar 9, 2017 原文链接:https://antonioleiva.com/property-delegation-kotlin/     ...

Kotlin变量和属性(五)

kotlin变量、属性

Kotlin编程之扩展属性和扩展伴生对象

kotlin编程:扩展属性和扩展伴生对象

Kotlin-属性和字段

属性声明在Kotlin中的类都有属性,他们可以用val声明为不可变的变量,也可以用var声明为可变的变量class Mk{ var name:String="MichaelKoo" v...

Kotlin 官方学习教程之属性和字段

Kotlin 官方学习教程之属性和字段
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Kotlin让属性只能被赋值一次且不能为空
举报原因:
原因补充:

(最多只允许输入30个字)