fieldを使ったカスタムGetterとSetter
backing fieldキーワードを使って、計算プロパティとカスタムsetterを記述します。
「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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- プライマリコンストラクターとプロパティパラメータ
- initブロックと初期化の順序
- fieldを使ったカスタムGetterとSetter
- lateinitと遅延初期化