Kotlin Academy · レッスン

fieldを使ったカスタムGetterとSetter

backing fieldキーワードを使って、計算プロパティとカスタムsetterを記述します。

レッスン 3/413 ステップ

「fieldを使ったカスタムGetterとSetter」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

プロパティは単なるフィールドではない

Kotlinの各プロパティには、自動生成されたgetterがあります(varの場合はsetterもあります)。これらをオーバーライドして、検証、ロギング、計算などのロジックを追加できます。

カスタムゲッター

get()をオーバーライドすると、読み取るたびに値を計算できます。

class Circle(val radius: Double) {
    val area: Double
        get() = Math.PI * radius * radius
}
fun main() {
    val c = Circle(3.0)
    println(c.area) // ~28.27
}

計算プロパティ

計算プロパティにはバッキングフィールドがなく、アクセスするたびに値が計算されます。

class Rectangle(val w: Int, val h: Int) {
    val area get() = w * h
    val perimeter get() = 2 * (w + h)
}
fun main() {
    val r = Rectangle(3, 4)
    println("${r.area}, ${r.perimeter}") // 12, 14
}

fieldを使うカスタムセッター

カスタムセッター内のfieldは、実際の保存領域であるバッキングフィールドを指します。

class Temperature {
    var celsius: Double = 0.0
        set(value) {
            require(value >= -273.15) { "below absolute zero" }
            field = value
        }
}
fun main() {
    val t = Temperature()
    t.celsius = 25.0
    println(t.celsius)
    // t.celsius = -300.0 // throws
}

バッキングフィールドの自動生成

getterまたはsetterがfieldを使用すると、Kotlinはバッキングフィールドを生成します。どちらも使用しない場合はフィールドは作成されず、プロパティは純粋な計算プロパティになります。

class Counter {
    var count: Int = 0
        set(value) {
            println("Setting count from $field to $value")
            field = value
        }
}
fun main() {
    val c = Counter()
    c.count = 5
    c.count = 10
}

副作用を持つセッター

ロギング、変更通知、関連する状態との同期には、カスタムセッターを使用します。

class Brightness {
    var level: Int = 50
        set(value) {
            val clamped = value.coerceIn(0, 100)
            println("Brightness -> $clamped")
            field = clamped
        }
}
fun main() {
    val b = Brightness()
    b.level = 75
    b.level = 150 // clamps to 100
    println(b.level)
}

プライベートセッター

セッターをprivateにすると、内部での変更を許可しながら、読み取り専用のAPIとして公開できます。

class Score {
    var value: Int = 0
        private set
    fun increment() { value++ }
    fun reset() { value = 0 }
}
fun main() {
    val s = Score()
    s.increment(); s.increment()
    println(s.value) // 2
    // s.value = 100 // ERROR: setter is private
}

セッターでの検証

カスタムセッターは、入力検証を行う自然な場所です。

class Email {
    var address: String = ""
        set(value) {
            require(value.contains("@")) { "invalid email" }
            field = value
        }
}
fun main() {
    val e = Email()
    e.address = "ada@example.com"
    println(e.address)
}

ロジックを持つゲッター

ゲッターでは保存された状態を変換できます。たとえば、保存された値を整形したり、デフォルトの代替値を適用したりできます。

class Profile(_name: String?) {
    var rawName: String? = _name
    val displayName: String
        get() = rawName ?: "(unset)"
}
fun main() {
    val p = Profile(null)
    println(p.displayName) // (unset)
}

valとvarの比較

valプロパティにはgetterだけがあり(setterはありません)、varプロパティには両方があります。

class Box {
    val readOnly: Int get() = 42
    var readWrite: Int = 0
}
fun main() {
    println(Box().readOnly)
    val b = Box(); b.readWrite = 5; println(b.readWrite)
}

よくある間違い:再帰

アクセサーの中でプロパティ名自身を使用しないでください。無限再帰が発生します。代わりにfieldを使用してください。

class Wrong {
    var x: Int = 0
        set(value) {
            // x = value // INFINITE RECURSION — calls setter again
            field = value // CORRECT
        }
}
fun main() {
    val w = Wrong(); w.x = 42; println(w.x)
}

クイックチェック

カスタム setter の中で、識別子fieldは何を参照しますか?

まとめ

プロパティへのアクセスにロジックを追加するには、get()とset()をオーバーライドします。アクセサー内でバッキングフィールドを読み書きするにはfieldを使用します。読み取り専用の公開 API にする場合は setter にprivateを付け、値が常に導出される場合は、バッキングフィールドを持たない計算プロパティを使用します。

無料で開始

AI チューターと学ぶ Kotlin — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「fieldを使ったカスタムGetterとSetter」レッスンは無料ですか?

はい。「fieldを使ったカスタムGetterとSetter」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「fieldを使ったカスタムGetterとSetter」で何を学びますか?

backing fieldキーワードを使って、計算プロパティとカスタムsetterを記述します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「fieldを使ったカスタムGetterとSetter」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. プライマリコンストラクターとプロパティパラメータ
  2. initブロックと初期化の順序
  3. fieldを使ったカスタムGetterとSetter
  4. lateinitと遅延初期化
← Kotlin Academyに戻る