【Kotlin】プロパティのカスタムアクセサメソッド(get/set)の使い方
この記事からわかること
- Kotlin/Android Studioでプロパティの使い方
- カスタムアクセサメソッドとバッキングフィールドとは?
- get/setの定義
index
[open]
\ アプリをリリースしました /
参考文献:公式リファレンス:WebView でのウェブアプリの作成
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
プロパティ(property)とは?
プロパティ(property)とは「属性/性質」と言った意味を持つ英単語であり、IT用語としてはオブジェクトの持つ設定や属性、データなどのことを呼びます。
Kotlinもオブジェクト指向型のプログラミング言語です。言語仕様として他の言語にも見られるクラス(class)が用意されており、クラス(オブジェクト)に対して任意のプロパティ(変数)とメソッド(関数)を定義することができます。
Kotlinでのプロパティはvarキーワードで変数として、valキーワードで定数として宣言できます。
class Company{
// 再代入可能
var name:String = "ame"
// 再代入不可
val telephoneNumber:String = "090-xxxx-xxxx"
}
バッキングフィールド
定義されたプロパティにはバッキングフィールド(Backing Field)と呼ばれる領域が自動で生成されます。ここに実際の値が格納され、プロパティはこのバッキングフィールド内に保存されている値の参照を保持し、バッキングフィールドへアクセスできるのはプロパティのみとなります。
バッキングフィールドへのプロパティから参照するにはゲッターとセッターと呼ばれるメソッドを使用します。言葉通りゲッターは値を取得するためのメソッドでセッターは値を更新するためのメソッドです。これは明示的に指定しなくても内部的に自動で生成してくれているため、意識することなくプロパティの値を取得/更新できるようになっています。
プロパティの正しい構文
var <propertyName>[: <PropertyType>] [= <property_initializer>]
[<getter>]
[<setter>]
カスタムアクセサメソッド
内部的に実装されているゲッターとセッターですが、明示的に記述することも可能です。例えば以下はnameプロパティのゲッターとセッターを明示的に記述した場合です。
var name: String = "ame"
get() {
return field
}
set(value) {
field = value
}
getメソッドの中ではfieldキーワードでバッキングフィールド内の値を参照できます。setメソッドは値を格納するため引数を持っており、この場合valueに格納したい値が保持され、fieldキーワードを上書きしています。このように明示的にゲッターとセッターを指定することで中に任意の処理を持たせたカスタムアクセサメソッドとして実装できます。
カスタムアクセサメソッドを定義してみます。nameLengthプロパティを準備して初期値を格納するところまでは変わりません。その下にgetメソッドを定義して、Stringのlengthプロパティを使用してnameの文字数を取得できるようになっています。カスタムアクセサメソッドを使用することでいわゆる計算プロパティを定義することができます
var nameLength: Int = 0
get(): Int {
return this.name.length
}
nameLengthには初期値として0を与えていますが、取得する際はthis.name.lengthを返すので上書きしようとしても取得できるのは文字数になります。
var company = Company()
company.nameLength = 10
print(company.nameLength) // 結果:3
また今回はクロージャでしたが1行の場合は省略でき、また型推論してくれるので型も省略し以下のようにスッキリとさせることも可能です。
var nameLength: Int = 0
get() = this.name.length
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。






