はじめに
Kotlin の強力な機能のひとつが 「拡張関数(extension function)」。
既存のクラスを継承せずに 新しいメソッドを追加できる 機能です。
Android / Kotlin 開発で頻出する構文で、
標準ライブラリや Jetpack(Compose, Coroutine, Flow)でも頻繁に使われています。
拡張関数とは?
「あるクラスに、新しい関数を“後付け”する」 仕組みです。
既存クラスを変更・継承せずにメソッドを追加できます。
基本構文
fun String.addBrackets(): String {
return "[$this]"
}
fun main() {
val name = "Anna"
println(name.addBrackets()) // → [Anna]
}
fun <ReceiverType>.<FunctionName>() の形式で定義します。
この場合 String がレシーバー型です。
レシーバー(Receiver)とは?
拡張関数は「レシーバーオブジェクト」に対して呼び出されます。
この this は「拡張されるクラス自身」を指します。
fun Int.double(): Int {
return this * 2
}
println(5.double()) // → 10
ここで this は Int 型の 5 を指しています。
拡張関数の内部的な仕組み
拡張関数は 実際には静的関数(static function) です。
コンパイル時には次のようなコードに変換されます:
fun double(num: Int): Int = num * 2
つまり、「見た目はメソッド呼び出し」ですが、内部的にはただのトップレベル関数です。
➡️ 継承やオーバーライドはできません。
実用例:文字列処理をシンプルに
fun String.isEmail(): Boolean {
return this.contains("@") && this.contains(".")
}
println("hello@example.com".isEmail()) // true
println("invalid_email".isEmail()) // false
→ String 型にメール判定を追加。
業務ロジックでの「再利用」や「可読性」向上に最適です。
Android 開発での使用例
View の拡張関数
fun View.visible() {
this.visibility = View.VISIBLE
}
fun View.gone() {
this.visibility = View.GONE
}
// 使い方
button.visible()
progressBar.gone()
→ View の状態切り替えを直感的に記述可能。
Context の拡張関数
fun Context.toast(message: String) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}
// 使い方
context.toast("保存しました!")
Android プロジェクトではよく見かけるパターンです。
Activity や Fragment に共通機能を簡潔に追加できます。
Null 安全との組み合わせ
拡張関数は nullable 型にも定義可能 です:
fun String?.isNullOrEmptySafe(): Boolean {
return this == null || this.isEmpty()
}
val name: String? = null
println(name.isNullOrEmptySafe()) // → true
→ null チェックを忘れずに安全に書けます。
拡張プロパティ(Extension Property)
関数だけでなく「プロパティ」も拡張できます:
val String.firstChar: Char
get() = this.first()
println("Kotlin".firstChar) // → K
ただし、拡張プロパティは 状態を保持できません(getter のみ)。
高度な使い方:ジェネリクスとラムダの組み合わせ
inline fun <T> T.applyIf(condition: Boolean, block: T.() -> Unit): T {
if (condition) block()
return this
}
val list = mutableListOf<Int>()
.applyIf(true) { add(10) }
.applyIf(false) { add(20) }
println(list) // → [10]
→ applyIf() のように条件付きで apply を呼ぶことも可能。
Kotlin 標準関数と同様の表現力を自作できます。
まとめ
| ポイント | 説明 |
|---|---|
| 定義構文 | fun ReceiverType.functionName() |
| this の意味 | 拡張先オブジェクトを指す |
| 継承・override | 不可(静的解決) |
| 用途 | 文字列処理・View操作・ユーティリティ関数など |
| nullable対応 |
String? のように安全に拡張可能 |
| プロパティ拡張 | val T.propertyName get() = ... |
拡張関数は、Kotlin コードを「より自然な言葉」に近づけるための強力な構文です。
再利用性・可読性・安全性のすべてを高めてくれます。
もしプロジェクトで 「同じ型に対して似た処理を何度も書いている」 なら、
それは拡張関数にするチャンスです。
参考
- Kotlin Official Docs – Extension Functions
- Android Developers: Kotlin extensions