1. ホーム
  2. android

[解決済み] Kotlin Backing Fieldは何のためにあるのか?

2022-11-15 11:41:52

質問

Java開発者として、バッキングフィールドのコンセプトは私にとって少し外国です。与えられた。

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

このバックフィールドは何のためにあるのでしょうか? Kotlinのドキュメント は言った。

Kotlinのクラスはフィールドを持つことができません。しかし、カスタムアクセサを使用する際にバッキングフィールドを持つことが必要な場合があります。 .

なぜですか?セッターの中でプロパティ名そのものを使うのと何が違うのでしょうか?

class Sample {        
    var counter = 0
    set(value) {
        if (value >= 0) this.counter = value // or just counter = value?
    }
}

どのように解決するのですか?

なぜなら、もしあなたが field キーワードがなければ、実際に get() または set(value) . これにより、カスタムアクセサでバッキングフィールドにアクセスすることができます。

サンプルの相当するJavaコードです。

class Sample {
    private int counter = 0;
    public void setCounter(int value) {
        if (value >= 0) setCounter(value);
    }
    public int getCounter() {
        return counter;
    }
}

どうやらこれは良くないようです。セッターはそれ自身の中に無限回再帰するだけで、何も変化しないのですから。kotlinでは foo.bar = value と書くと、セッターの呼び出しに変換され、代わりに PUTFIELD .


編集:Javaは フィールド であるのに対し、Kotlinは プロパティ があり、これはフィールドよりもむしろ上位の概念です。

プロパティには、バッキングフィールドを持つものと持たないものの2種類があります。

バッキングフィールドを持つプロパティは、フィールドの形で値を保存します。そのフィールドによって、値をメモリに保存することが可能になります。このようなプロパティの例としては firstsecond のプロパティは Pair . このプロパティは、メモリ内の Pair .

バッキングフィールドを持たないプロパティは、メモリに直接格納する以外の方法でその値を格納する必要があります。他のプロパティや、オブジェクト自体から計算する必要があります。そのようなプロパティの例としては indices の拡張プロパティです。 List に基づいて計算された結果であり、フィールドによってバックアップされているわけではありません。 size プロパティに基づく計算結果です。そのため、メモリ内表現である List (のメモリ内表現を変更することはありません(Javaは静的型付けされているため、全くできません)。