バッキングフィールド(Backing Field)
簡単に言えば、バッキングフィールドは、プロパティーアクセサ(ゲッターまたはセッター)の内部でのみ使用可能なフィールドです。
Kotlinでは、フィールドを直接宣言することはできません。そのため、バッキングフィールドはアクセサのデフォルト実装を使用している場合、またはカスタムアクセサがフィールドを通して参照される場合にのみ自動生成されます。このバッキングフィールドは、アクセサの再帰的な呼び出しを回避するために使用され、最終的に StackOverflow
エラー を防ぐことができます。
では、バッキングフィールドが必要な理由を見てみましょう。
上のコードは、doubledNumber
の値を取得しようとすると再帰的にゲッターを呼び出しています。
同様に、doubledNumber
の値をセットしようとすると、this.doubleNumber
がセッターメソッド内から再びセッターを呼び出すように、同じセッターを再帰的に呼び出してしまいます。
バッキングフィールドを使用することでこれを克服することができます。
上の例のような再帰的なエラーを防ぐために、Kotlinはフィールド識別子を使ってアクセスできる自動バッキングフィールドを提供しています。
このように、プロパティー名をfield
に置き換えることによって、StackOverflow
エラーを起こさずにdoubledNumber
にアクセスすることができます。
しかし、以下のように、プロパティが全くデフォルトアクセサを実装していない場合、またはカスタムアクセサがフィールド識別子を通してそれを参照していない場合、フィールド識別子は生成されません。
バッキングプロパティー(Backing Property)
バッキングフィールド機能を使うと、ゲッターやセッターの範囲内でしかプロパティのフィールドにアクセスすることができません。ゲッターやセッターを使わずに直接アクセスしたい場合には、バッキングプロパティ機能を使うべきです。
バッキングプロパティーは、ゲッターやセッター外でフィールドに直接アクセスしたいときなどに使われ、private
フィールドに_
を付けて明示されます。
上の例を見ると、バッキングプロパティ機能を使うことで、フィールドに直接アクセスできることがわかります。
この記事が、バッキングフィールドとバッキングプロパティの理解を深める上で、多少なりともお役に立てたのであれば幸いです。Kotlinにはそんな便利な機能が満載です。公式ドキュメントを自分で見てみることをお勧めします。