2017-09-13 73 views
2

我想用构造函数声明类,但似乎有与该语法冲突并声明类成员。类构造函数和成员变量(字段)

任何建议这些如何一起?

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

    init { 
     this.name = aName 
    } 
} 
+0

难道你不能只声明名称为var? –

回答

3

您使用的setter您的setter里面做set(myName) {this.name = myName}。这是一个递归调用,而不是你应该做的。而是使用field accessor这样的:

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

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

class Person(var name: String) 
+0

为什么在第一个示例中名称为Optional? – AjahnCharles

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" 
+0

是的,我对能见度,吸气者和制定者很困惑。与java规则相比,你直接向成员发送消息,但是还有setter和getter,这使得成员的可见性对我来说更加令人困惑。 –

0

我想补充一下已经被别人说,这里是一个更好的语法,如果你想拥有aName作为一个单独的构造函数参数:

class Person (aName:String) { 
    var name = aName 
} 
相关问题