Kotlin:可变或者不可变的属性的使用

作者: 1024工场 | 来源:发表于2017-09-13 01:23 被阅读211次

    一、声明属性


    1. Kotlin类可以有属性,属性可以用关键字var声明为可变的,否则使用只读关键字val
    2. 使用属性,只要用名称引用它即可;
    class Address {
        //1.声明可变var可变属性,val只读属性
        var name: String = ……
        var street: String = ……
        var city: String = ……
        var state: String? = ……
        var zip: String = ……
    }
    
    fun copyAddress(address: Address): Address {
        val result = Address() 
        //2.用名称引用即可,将调用访问器
        result.name = address.name
        result.street = address.street
        // ……
        return result
    }
    

    二、Getters与Setters


    1. 声明一个属性的完整语法如下:
      初始化器(initializer)、getter和setter都是可选的;
      属性类型可以从初始器(从getter返回值)推断出来,也可以省略
    var <propertyName>[: <PropertyType>] [= <property_initializer>]
        [<getter>]
        [<setter>]
    
    1. 只读属性和可变属性不同:只读用val可变用var只读不允许setter
    2. 编写自定义的访问器像普通函数,在属性声明内部;
    3. 改变访问器可见性或者对其注解,但不改变默认实现,可以定义访问器而不定义其实现
    //2.可变属性var,类型 Int、默认 getter 和 setter  
    var initialized = 1 
    //2.只读属性val,类型 Int 、默认 getter
    val inferredType = 1 
    //3.自定义访问器getter和setter,按照惯例setter参数的名称是value
    var stringRepresentation: String
        get() = this.toString()
        set(value) {
            setDataFromString(value) // 解析字符串并赋值给其他属性
        }
    //4.此 setter 是私有的并且有默认实现,用 Inject 注解此 setter
    var setterVisibility: String = "abc"
        private set 
    var setterWithAnnotation: Any? = null
        @Inject set 
    
    1. Kotlin不能有字段,当使用自定义访问器时,有一个幕后字段有时是有必要的,通过field标识符访问;
    var counter = 0
      set(value) {
        if (value >= 0)
          //5.此初始器值直接写入到幕后字段,field标识符智能在属性的访问器内
          field = value
      }
    

    三、编译期常量


    1. 已知值的属性可以使用const修饰符标记为编译期常量,属性要位于顶层或者object的一个成员,用String或原生类型初始化没有自定义getter
    const val SUBSYSTEM_DEPRECATED: String = "This subsystem is deprecated"
    @Deprecated(SUBSYSTEM_DEPRECATED) fun foo() { …… }
    

    四、延迟初始化属性


    1. 一般地,属性声明为非空类型必须在构造函数初始化,然而通过依赖注入初始化,或者单元测试setup方法初始化时经常不方便;
    2. 使用lateinit修饰符标记该属性,只能用于在类体中声明的var属性,当且仅当属性没自定义getter或setter时,属性必须是非空类型,并且不能是原生类型
    public class MyTest {
        lateinit var subject: TestSubject
        @SetUp fun setup() {
            subject = TestSubject()
        }
        @Test fun test() {
            subject.method()  // 直接解引用
        }
    }
    

    1.新技术,新未来!尽在1024工场。时刻关注最前沿技术资讯,发布最棒技术博文!(甭客气!尽情的扫描或者长按!)

    1024工场服务号
    2.加入“Kotlin开发”QQ讨论群,一起学习一起Hi。(甭客气!尽情的扫描或者长按!)
    Kotlin开发群

    相关文章

      网友评论

      本文标题:Kotlin:可变或者不可变的属性的使用

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