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入门(8)空值的判断与处理

上一篇文章介绍了如何对循环语句进行操作,末尾还演示了发现空串时直接继续下一循环,只是在初始化字符串数组时使用了“val poem2Array:Array = ***”,该表达式不免令人疑惑,为何这里要...
  • aqi00
  • aqi00
  • 2017年07月20日 09:14
  • 2343

Kotlin学习笔记——类和对象

跟Java一样,Kotlin里面类的声明使用的是关键字class,类的声明包含有三部分:类名,类头,类体,其中,类头和类体是可选的。class EmptyConstructors在Kotlin中,一个...
  • hp910315
  • hp910315
  • 2016年03月10日 12:05
  • 14619

Kotlin-对象表达式,对象声明及伴随对象

概述在Java中,不管是为了实现接口,或者是抽象类,我们总是习惯使用匿名内部类。最熟悉的例子,莫过于对单击事件的监听,也就是这样写:btn.setOnClickListener(new OnClick...
  • IO_Field
  • IO_Field
  • 2016年10月26日 19:53
  • 3260

Kotlin基础语法学习笔记

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

Kotlin 变量和属性

kotlin 是一门面向对象的语言  没有基本类型 不像java一样integer 和int kotlin的数值对象 类型 长度 Double 64 Float 32 Long...
  • axuanqq
  • axuanqq
  • 2016年03月24日 10:36
  • 4149

kotlin类型 非空 和空类型的处理

/** * Created by gacmy on 2017/6/15. */ fun strLen(s:String) = s.length//会产生编译错误 空指针异常 //fun strLe...
  • gacmy
  • gacmy
  • 2017年06月16日 14:42
  • 818

kotlin--空安全(可空类型和非空类型,Elvis 操作符,!! 操作符)

fun main(args: Array) { //如果a没有指明可以为空,那么赋null值的时候编译就不通过 var a:String ="1111" var L=a.le...
  • u010361662
  • u010361662
  • 2017年01月06日 10:00
  • 3477

Android kotlin静态属性、静态方法

只需要用 companion object 包裹相应代码块即可。以静态属性为例:class Constants { companion object { val BASE_UR...
  • u010296640
  • u010296640
  • 2017年06月07日 17:21
  • 2952

Kotlin-null的处理

NullPointerException,俗称NPE,不管菜鸟还是老鸟们,都是不可避免,经常遇到的一个异常,解释起来很简单,就“空指针”三个字。总是在一次不小心,而掉进这个陷阱里。Kotlin 的设计...
  • IO_Field
  • IO_Field
  • 2016年12月05日 21:55
  • 3921

Kotlin-Null 值安全性

Kotlin 类型系统的设计目标就是希望消除代码中 null 引用带来的危险。 Kotlin 的类型系统致力于从我们的代码中消除 NullPointerException. 只有以下情况可能...
  • Silk2018
  • Silk2018
  • 2017年05月22日 17:42
  • 709
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Kotlin让属性只能被赋值一次且不能为空
举报原因:
原因补充:

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