[解決済み] Kotlin Backing Fieldは何のためにあるのか?
質問
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種類があります。
バッキングフィールドを持つプロパティは、フィールドの形で値を保存します。そのフィールドによって、値をメモリに保存することが可能になります。このようなプロパティの例としては
first
と
second
のプロパティは
Pair
. このプロパティは、メモリ内の
Pair
.
バッキングフィールドを持たないプロパティは、メモリに直接格納する以外の方法でその値を格納する必要があります。他のプロパティや、オブジェクト自体から計算する必要があります。そのようなプロパティの例としては
indices
の拡張プロパティです。
List
に基づいて計算された結果であり、フィールドによってバックアップされているわけではありません。
size
プロパティに基づく計算結果です。そのため、メモリ内表現である
List
(のメモリ内表現を変更することはありません(Javaは静的型付けされているため、全くできません)。
関連
-
[解決済み] Androidのレイアウトファイルの「tools:context」とは何ですか?
-
[解決済み] Kotlin 三項条件演算子
-
[解決済み] by lazy" と "lateinit" を使ったプロパティの初期化
-
[解決済み] Kotlinのvarとvalの違いは何ですか?
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み】KotlinでJavaの静的メソッドに相当するものは何ですか?
-
[解決済み] BottomSheetDialogFragmentの状態をexpandedに設定する。
-
[解決済み] CardView layout_width="match_parent "が親のRecyclerViewの幅と一致しない。
-
[解決済み] 非ActivityクラスでContextを取得する [重複].
-
[解決済み] EditTextをReadOnlyにする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] HttpPostによる画像送信
-
[解決済み] プログラムでソフトキーボードを開く
-
[解決済み] EclipseのAndroidプロジェクトにライブラリ/JARを追加する
-
[解決済み] これはどういうことですか?失敗 [INSTALL_FAILED_CONTAINER_ERROR]?
-
[解決済み] アンドロイドのdatepickerダイアログで最大の日付を設定するには?
-
[解決済み] RecyclerViewのアイテムに波及効果を追加する
-
[解決済み] AsyncTaskLoaderとAsyncTaskの比較
-
[解決済み] Android: xml リソースからの整数値
-
[解決済み] 文字列リソースにHTML?
-
[解決済み] <string> XMLで改行やタブを作るには(eclipse/android)?