【Kotlin】プロパティのカスタムアクセサメソッド(get/set)の使い方
この記事からわかること
- Kotlin/Android Studioでプロパティの使い方
- カスタムアクセサメソッドとバッキングフィールドとは?
- get/setの定義
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
参考文献:公式リファレンス: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
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。