Kotlin 属性

作者: jinkui | 来源:发表于2017-05-25 11:03 被阅读124次

    属性和 Java 类似, 可以是 var 或者 val, 可以加可见性修饰符。
    声明属性的完整语法是:

    var <propertyName>: <PropertyType> [= <property_initializer>]
        [<getter>]
        [<setter>]
    
    var name: String
        get() = field - 1
        set(value) {
            field = value -1
        }
    

    Kotlin 提供了一种自动的后端域变量, 可以通过 field 标识符来访问。

    一般情况不会修改属性的 getter 和 setter, 使用默认实现就可以,如上的代码并不常用。常用的是修改可见性,如下示例:

    var name: String
        private set // 可见度为 private, 并使用默认实现
    
    • 常量

    如果属性值在编译期间就能确定, 则可以使用 const 修饰符,达到 Java 里面的 final static 常量的效果。
    但是必须是顶级属性,或者 object 的成员,如:

    const val DEBUG = true
    
    class Hello {
        companion object {
            const val TAG = "hello"
        }
    }
    
    • 延迟初始化属性

    通常, 如果属性声明为非 null 数据类型, 那么属性值必须在构造器内初始化。这种情况带来一些不便,比如有些属性在setup()的时候初始化。这种情况,可以将属性声明为可空变量, 但是会带来 null 值检查。这种情况可以为属性添加lateinit修饰。

    class Hello {
        private lateinit var persion: Persion
        fun setup(persion: Persion) {
            this.persion= persion
        }
        fun test() {
            println(persion.name)
        }
    }
    

    lateinit 只能用于 var 类属性, 属性类型必须是非 null 的, 而且不能是基本类型。lateinit 属性被初始化之前访问它, 会抛出一个特别的异常。

    • 覆盖属性

    和方法的覆盖类似,open 的 属性可以被覆盖,但是属性的类型需要一致。

    open class Base {
        open protected val x = 10
    }
    
    class Hello: Base() {
        override var x = 12
    }
    

    val 可以修改成 var, 反过来不行。


    参考
    《Programming Kotlin》Stephen Samuel ,Stefan Bocutiu
    《Kotlin in Action》Dmitry Jemerov,Svetlana Isakova

    相关文章

      网友评论

        本文标题:Kotlin 属性

        本文链接:https://www.haomeiwen.com/subject/iawaxxtx.html