【问题标题】:class constructor and member variables(fields)类构造函数和成员变量(字段)
【发布时间】:2018-02-22 17:30:03
【问题描述】:

我正在尝试使用构造函数声明类,但似乎与该语法和声明类成员有冲突。

有什么建议可以将它们组合在一起吗?

class Person (aName:String) {
    var name : String
        get() = this.name
        set(myName) {this.name = myName}

    init {
        this.name = aName
    }
}

【问题讨论】:

  • 你不能把 name 声明为 var 吗?

标签: class variables constructor kotlin


【解决方案1】:

你不需要这些。您可以在构造函数中将name 定义为var,Kotlin 会将其公开为属性。

class Person(var name: String)

// Usage...
val p = Person("Dave")
println(p.name) // "Dave"
p.name = "Phil"
println(p.name) // "Phil"

【讨论】:

  • 是的,我对可见性、getter 和 setter 感到很困惑。与 java 规则相比,您直接处理成员,但有 setter 和 getter,这让成员的可见性让我更加困惑
【解决方案2】:

您正在通过 set(myName) {this.name = myName} 在您的 setter 中使用 setter。这是一个递归调用,而不是你应该做的。而是像这样使用field accessor

name: String? = null
  set(myName) {
     field = myName
  } 

但实际上,你甚至不需要这个。您可以在主构造函数中声明 name 应该是您的类的属性:

class Person(var name: String) 

【讨论】:

  • 为什么在第一个示例中将 name 设为可选?
【解决方案3】:

只是为了补充其他人所说的,如果您想将aName 作为单独的构造函数参数,这里有一个更好的语法:

class Person (aName:String) {
    var name = aName
}

【讨论】:

    猜你喜欢
    • 2011-09-13
    • 2011-08-08
    • 2015-05-25
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多