Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
カスタム getter / setter
プロパティのアクセス時の動作をカスタマイズする『getter』と、値を変更する際の動作を定義する『setter』の仕組みです。
構文
// カスタム getter
val プロパティ名: 型
get() = 式
// カスタム setter(var が必要)
var プロパティ名: 型 = 初期値
get() = field
set(value) {
field = value
}
構文一覧
| 構文 / キーワード | 概要 |
|---|---|
| get() { } | プロパティの読み取り時に呼び出される処理を定義します。 |
| set(value) { } | プロパティへの代入時に呼び出される処理を定義します。引数名は任意です。 |
| field | バッキングフィールドへの参照です。getter / setter 内でのみ使用できます。 |
サンプルコード
class Circle(val radius: Double) {
// カスタム getter:面積を計算して返します。
val area: Double
get() = Math.PI * radius * radius
}
class Person(name: String) {
// setter でバリデーションを行います。
var name: String = name
set(value) {
// 空文字列は設定できないようにします。
field = if (value.isNotBlank()) value else field
}
// getter で大文字変換した値を返します。
val upperName: String
get() = name.uppercase()
}
fun main() {
val circle = Circle(5.0)
println(circle.area) // 78.53...
val person = Person("田中")
println(person.upperName) // 田中(大文字変換)
person.name = "" // 空文字列は無視されます。
println(person.name) // 田中(変更されていない)
person.name = "鈴木"
println(person.name) // 鈴木
}
概要
カスタム getter を使うと、プロパティの値を毎回計算して返すことができます。バッキングフィールドを必要とせず、他のプロパティから派生した値を表現する際に便利です。
カスタム setter では引数『value』で受け取った新しい値に対してバリデーションや変換処理を行い、『field』に代入します。setter 内で直接プロパティ名を使って代入すると無限再帰になるため、必ず『field』を使ってください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。