2017-09-13 76 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 
} 
相關問題