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基础语法学习笔记

Kotline简介 Kotlin是一门与Swift类似的静态类型JVM语言,由JetBrains设计开发并开源。与Java相比,Kotlin的语法更简洁、更具表达性,而且提供了更多的特性,比如,高阶函...

Kotlin 变量和属性

kotlin 是一门面向对象的语言  没有基本类型 不像java一样integer 和int kotlin的数值对象 类型 长度 Double 64 Float 32 Long...

Kotlin基础语法-属性(Property)与域(Field)

属性(Property)与域(Field) 声明属性 Kotlin 中的类可以拥有属性. 可以使用 var 关键字声明为可变(mutable)属性, 也可以使用 val 关键字声明为只读属...

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

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

Kotlin Reference (十四) 委托类和委托属性

委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。 Kotlin 直接支持委托模式,更加优雅,简洁。Kotlin 通过关...

Kotlin笔记(七)——委托属性(Delegated Properties)

Kotlin委托属性(Delegated Properties)

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

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

学习kotlin第13天_具体化的类型参数、内联属性、解构声明、集合

继续之前的坑,我原本不打算继续看文档了,直接上手个小项目,但是项目中遇见个小问题,list似乎和java中的有区别。。。一查文档发现在后面。。。所以继续踩坑。

Kotlin-属性

声明属性对于类而言,属性必然是不可缺少的。在Kotlin中,属性值由var和val关键字声明,其中,var声明的属性值为可变的,而val声明的属性值是只读属性,也就是说其值是不可变的。class Pe...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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