2017-08-14 3 views
1

私はクラスのオブジェクトを作成し、smthフィールドを呼び出すと、それはとにかくget()プロパティを呼び出します getterとsetterを持つフィールドを初期化していますか?

class SomeClass { 
    var smth: String = "Initial value" 
      get() = "Here it is" 
      set(value) { 
       field = "it is $value" 
      } 
} 

Kotlin

に例のフィールドを持つクラスを作成しました。

 val myValue = SomeClass().smth// myValue = "Here it is" 

ですから、なぜゲッターを持つフィールドを初期化する必要がありますか?

var smth: String // Why this gives error? 
     get() = "Here it is" 
     set(value) { 
      field = "it is $value" 
     } 

これは常にget()プロパティから値を返しますか?

+1

これは、初期化された値なしで 'get()= ...'を使用した場合、Kotlinはバッキングフィールドを生成しないためです。例えば:val smth:String get()= "ここでは" –

答えて

2

私はちょうどそれはコンパイラが推測できるほど賢くないので、それがnullではないということだと思います参照してください。

は実際に非常に類似したコードは、どうやら、このコードは

constructor(stringRepresentation: String) { 
    this.stringRepresentation = stringRepresentation 
} 

のようなコンストラクタが追加されるかしない限り、コンパイルされませんここでhttps://kotlinlang.org/docs/reference/properties.html

var stringRepresentation: String 
    get() = this.toString() 
    set(value) { 
     setDataFromString(value) // parses the string and assigns values to other properties 
    } 

公式ドキュメントから提示します。

+0

set(value:String){'は動作しませんか? – EpicPandaForce

3

あなたがセッターにフィールドfieldを支持してきたので、私たちは初期化する必要があり、これはreference

関連する問題