代码之家  ›  专栏  ›  技术社区  ›  Tord Larsen smaznet

为什么要在kotlin类构造函数中放置val或var

  •  3
  • Tord Larsen smaznet  · 技术社区  · 6 年前

    在下面的第一段代码中学习Kotlin就是 val 关键字在其他代码中没有, 如果 var

    class Person(val firstName: String, val lastName: String) {
    }
    
    class Person(firstName: String, lastName: String) {
    }
    
    2 回复  |  直到 6 年前
        1
  •  20
  •   zapl    6 年前

    如果你忽略了 val var https://kotlinlang.org/docs/reference/classes.html

    class Person(firstName: String, lastName: String) {
        // directly in val / var declarations
        val firstName = firstName.capitalize()
        val lastName = lastName
    
        // in init blocks
        val fullName: String
        init {
            fullName = "$firstName $lastName"
        }
    
        // secondary constructors can only see their own parameters
        // and nothing else can access those
        constructor(fullName: String) : this("", fullName)
    }
    

    但它也适用于 delegation using by

    interface Named {
        fun getName(): String
    }
    class Human(private val fname: String, private val lname: String) : Named {
        override fun getName() = "$fname + $lname" // functions need val since
                                                   // value is resolved after construction
    }
    class Person2(firstName: String, lastName: String) : Named by Human(firstName, lastName)
    
    class Person3(human: Human) : Named by human {
        constructor(firstName: String, lastName: String): this(Human(firstName, lastName))
    }
    

    或在财产委托中

    class Person4(firstName: String, lastName: String) {
        val fullName: String by lazy { "$firstName $lastName" }
    }
    

    注意:闭包是在初始化时捕获的,因此当 lazy 最终评估。

        2
  •  37
  •   Alex Nolasco    6 年前