2017-12-06 5 views
-3

私はコトリン公式チュートリアルを見てきました。私はKotlinでコトリンについて私に説明してくださいBacking Fields

クラスはフィールドを持つことができない、バッキングフィールド

それは言うというトピックに出会いました。ただし、カスタムアクセサを使用する場合は、バッキングフィールドが必要になることがあります。これらの目的のために、Kotlinはフィールド識別子を使用してアクセスすることができる自動バッキングフィールドを提供します。

var counter = 0 // the initializer value is written directly to the backing field 
    set(value) { 
     if (value >= 0) field = value 
    } 

私は私の質問には、対抗するために指して、「フィールド」ですthis official link

から上記を得ました変数?

バッキングフィールドの例を教えていただけますか、わかりやすい言葉で私を説明できますか?何も指定されていない場合はどのように動作する

+0

なぜ最初は否定的なのでしょうか? –

+0

投稿したコードは、コード例全体ではありません。人々は完全な画像を得るために外部リンクに行く必要はありません。そうです、 'field'は突然変異するセッターを助ける特別なキーワードです。 – Phix

答えて

3

このクラスを考えてみましょう

class SomeClass { 
    var counter: Int = 0 
     set(value) { 
      if (value >= 0) field = value 
     } 
} 

Main menu -> Tools -> Kotlin -> Show Kotlin Bytecodeに移動し、KotlinバイトコードパネルでDecompileをクリックします。

あなたが見るものは、Javaの同等のコードです。

public final class SomeClass { 
    private int counter; 

    public final int getCounter() { 
     return this.counter; 
    } 

    public final void setCounter(int value) { 
     if(value >= 0) { 
     this.counter = value; 
     } 
    } 
} 
+0

あなたは他の問題も見つけ出す道を開いています...ありがとうございます。 –

1

、の例で理解してみましょう、この

class Person { 
    var name: String = "" 
} 

検討し、プロパティ()は、デフォルトのゲッターとセッターを使用しています。私たちはこの

class Person { 

    var name: String = "" 
    get() = field.toUpperCase() 
    set(value) { 
    field = "Name: $value" 
    } 


} 
にクラスを超える変更よりも、nameプロパティに設定したカスタム動作をしたいのであれば

:当然のことながら、 は 既存のコードを変更することなく、何が必要カスタム動作を実行するように変更することができます

プロパティがカスタムゲッターまたはセッターで固有の値にアクセスする必要がある場合( の場合)、バッキングフィールドを作成する必要があります。これはフィールド 予約語を使用してアクセスすることができ、 が使用されているとコンパイラによって自動的に作成されます。

1

はバッキングフィールドは、それが

バッキングフィールドは、生成されたアクセサの少なくとも1 のデフォルトの実装を使用する場合にのみ、クラス内のプロパティ のために生成されるだけのフィールドであり、プロパティがgetter/setterのデフォルト実装を使用する場合パースペクティブJavaの次のコードが表示された場合。それは正しいように見えます。しかし、 "kotlin"ではExceptionをスローします。私たちは「最初名」または「姓」のプロパティにアクセスしたり、設定した場合、デフォルトのアクセサが呼び出されますので

class User{ 
     var firstName : String //backing field generated 
     get() = firstName 
     set(value) { 
      firstName = value 
     } 
     var lastName : String //backing field generated 
     get() = lastName 
     set(value) { 
      lastName = value 
     } 
     val name : String //no backing field generated 
     get() = "{$firstName $lastName}" 
     var address : String = "XYZ" //^because there is no default //^implementation of an accessor 
} 

はKotlinでは上記のコードスニペットはStackOverflowのをスローします。したがって、Kotlinでは "user.firstName =" value ""はJavaの "user.setFirstName(" value ")"と同じです。

"set(value){firstName =" value "}"が呼び出されると、

この問題の解決策は、ユーザのバッキングフィールドです。Kotlinでは、バッキングフィールドにアクセサの中の "field"キーワードを使用してアクセスできます。以下の修正されたコードスニペットを見てください。

class User{ 
     var firstName : String get() = field 
     set(value) { 
      field = value 
     } 
     var lastName : String get() = field 
     set(value) { 
      field = value} 
     } 
} 

希望します。もっと助けが必要な場合は、私に相談してください。

2

キーワードfieldキーワードを使用すると、カスタムセッター内で値を割り当てることができます。 kotlinでcounter = 3set(3)に電話します。したがって、あなたが定義する場合

var counter=0 
set(value){ 
    counter = value 
} 

スタックがいっぱいになり、プロセスがクラッシュするまで再帰的に自分自身を呼び出します。 fieldキーワードは、セッターを再度呼び出さずに直接値を割り当てます。 Androidのメーカーで

関連する問題