Kotlin Academy · レッスン

拡張プロパティと計算拡張

サブクラス化せずに、既存のクラスへ計算プロパティを追加します。

レッスン 2/413 ステップ

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

拡張プロパティ

拡張プロパティを使うと、サブクラス化せずに既存の型へ計算プロパティを追加できます。バッキングフィールドはありません。

読み取り専用の拡張プロパティ

getter を定義して、計算される拡張プロパティを作成します。
val String.wordCount: Int
    get() = trim().split(Regex("\\s+")).size
println("hello world kotlin".wordCount)  // 3

可変の拡張プロパティ

getter と setter の両方を定義して、読み書き可能な拡張プロパティを作成します。
var MutableList<Int>.first: Int
    get() = this[0]
    set(value) { this[0] = value }
val list = mutableListOf(1, 2, 3)
list.first = 10
println(list)  // [10, 2, 3]

バッキングフィールドなし

拡張プロパティにはバッキングフィールドを持たせられません。常に既存の状態から計算されます。
// ERROR: extension property cannot have backing field
// var String.cache: String = ""  // NOT allowed!

// OK: computed only:
val String.isPalindrome: Boolean
    get() = this == this.reversed()

コレクションの拡張プロパティ

コレクション型に便利なプロパティを追加します。
val <T> List<T>.secondOrNull: T?
    get() = if (size >= 2) this[1] else null
val <T> List<T>.isNotNullOrEmpty: Boolean
    get() = isNotEmpty()
println(listOf(1, 2, 3).secondOrNull)  // 2

Boolean 拡張プロパティ

型チェック用の読みやすい Boolean プロパティを作成します。
val Any.isString: Boolean get() = this is String
val String.hasDigits: Boolean get() = any { it.isDigit() }
val Int.isPositive: Boolean get() = this > 0
println(42.isPositive)        // true
println("abc123".hasDigits)   // true

拡張プロパティと拡張関数

計算が単純でオブジェクトの特性を表す場合はプロパティを使用します。パラメーターや副作用がある場合は関数を使用してください。
// Property: stateless, simple characteristic
val String.isEmail: Boolean get() = '@' in this
// Function: has parameters
fun String.padCenter(width: Int) = padStart((length + width) / 2)

Companion Object の拡張

Companion Object に拡張プロパティを追加します。
data class Color(val r: Int, val g: Int, val b: Int) {
    companion object
}
val Color.Companion.RED get() = Color(255, 0, 0)
val Color.Companion.WHITE get() = Color(255, 255, 255)
println(Color.RED)  // Color(r=255, g=0, b=0)

コンテキスト依存の拡張プロパティ

クラス内で定義した拡張プロパティは、そのクラスのスコープ内にいる場合にのみ適用されます。
class Formatter {
    val Int.formatted: String
        get() = "%,d".format(this)
    fun format(n: Int) = n.formatted
}
println(Formatter().format(1000000))  // 1,000,000

DSL での拡張関数の利用

拡張プロパティは Kotlin DSL の設計における基本要素です。
val Int.dp: Float get() = this * 2.5f
val Float.sp: Float get() = this * 1.0f
// In DSL context:
view.setPadding(16.dp.toInt())

ジェネリックな拡張プロパティ

拡張プロパティには型パラメーターを持たせることができます。
val <T> List<T>.head: T?
    get() = firstOrNull()
val <T> List<T>.tail: List<T>
    get() = drop(1)
println(listOf(1,2,3).head)  // 1
println(listOf(1,2,3).tail)  // [2, 3]

クイックチェック

Kotlin の拡張プロパティにはバッキングフィールドを持たせられますか?

まとめ

拡張プロパティを使うと、バッキングフィールドなしで型に計算される特性を追加できます。単純で状態を持たない計算に使用してください。可変の拡張プロパティには setter を定義できます。DSL や流暢な API に適しています。次はスコープ付き拡張と Companion Object の拡張です。
無料で開始

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

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

コース
51
レッスン
203

よくある質問

「拡張プロパティと計算拡張」レッスンは無料ですか?

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

「拡張プロパティと計算拡張」で何を学びますか?

サブクラス化せずに、既存のクラスへ計算プロパティを追加します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「拡張プロパティと計算拡張」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. 拡張関数:構文とディスパッチ規則
  2. 拡張プロパティと計算拡張
  3. スコープ付き拡張とcompanion拡張
  4. 実践的な拡張:Context、View、Stringヘルパー
← Kotlin Academyに戻る