Kotlin Academy · レッスン

実践的なreifiedパターン:パース、DI、シリアライゼーション

reifiedジェネリクスをJSONパース、依存性解決、リフレクションヘルパーに適用します。

レッスン 4/414 ステップ

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

3 つの主なユースケース

reified 型パラメーターは、Kotlin で繰り返し登場する 3 つのパターン、つまりJSON/データのパース、依存性注入、シリアライズヘルパーで特に役立ちます。いずれも ::class.java 引数を渡す定型コードをなくせます。

パターン 1 — 型安全な JSON パース

Gson や Jackson を reified 拡張関数でラップすると、呼び出し側で Class を明示的に渡す必要がなくなります。

inline fun <reified T> String.parseJson(): T =
    Gson().fromJson(this, T::class.java)

val user: User = jsonString.parseJson()

コレクションのパース

ジェネリックなリストをパースするには TypeToken が必要です。reified を使えば、この複雑さを隠せます。

inline fun <reified T> String.parseList(): List<T> {
    val type = object : TypeToken<List<T>>() {}.type
    return Gson().fromJson(this, type)
}

val users: List<User> = jsonString.parseList()

kotlinx.serialization のアプローチ

kotlinx.serialization は内部ですでに reified を使用しています。トップレベル関数 decodeFromString() は、reified inline 関数である serializer() に依存しています。

val user = Json.decodeFromString<User>(jsonString)
// equivalent to: Json.decodeFromString(serializer<User>(), jsonString)

パターン 2 — Service Locator / DI

シンプルな Service Locator では、呼び出し側が KClass を渡さなくても、型によって依存関係を解決できます。

object ServiceLocator {
    val registry = mutableMapOf<KClass<*>, Any>()
    inline fun <reified T : Any> get(): T =
        registry[T::class] as? T ?: error("No binding for ${T::class}")
    inline fun <reified T : Any> bind(instance: T) {
        registry[T::class] = instance
    }
}

Android での ViewModel の取得

Android で最もよく使われる reified パターンです。

inline fun <reified VM : ViewModel> ComponentActivity.viewModel(): VM =
    ViewModelProvider(this)[VM::class.java]

// Usage
val vm: MyViewModel by lazy { viewModel() }

パターン 3 — 安全なキャストヘルパー

フォールバック付きの reified キャストヘルパーを使うと、あちこちで明示的に as? を使うよりもコードをすっきりさせられます。

inline fun <reified T> Any?.safeCast(): T? = this as? T

val name: String? = someAny.safeCast<String>()

コレクションの型チェック

標準の filterIsInstance() は、reified を使ったコレクションフィルターの代表例です。これを基盤に、より高レベルなバリエーションを構築できます。

inline fun <reified T> List<Any>.onlyInstancesOf(block: (T) -> Unit) =
    filterIsInstance<T>().forEach(block)

items.onlyInstancesOf<Button> { it.setEnabled(true) }

型によるイベントリスナーの登録

reified を使うと、型に基づいてディスパッチするイベントバスを使いやすくできます。

class EventBus {
    val handlers = mutableMapOf<KClass<*>, (Any) -> Unit>()
    inline fun <reified E : Any> on(noinline handler: (E) -> Unit) {
        handlers[E::class] = { handler(it as E) }
    }
    fun post(event: Any) = handlers[event::class]?.invoke(event)
}

reified と拡張関数の組み合わせ

ジェネリックなレシーバーに対する reified 拡張関数を使うと、型安全性を保ちながら、API に流れるような使い心地を持たせられます。

inline fun <reified T : Any> SharedPreferences.get(key: String, default: T): T = when (T::class) {
    Int::class    -> getInt(key, default as Int) as T
    String::class -> getString(key, default as String) as T
    Boolean::class -> getBoolean(key, default as Boolean) as T
    else -> error("Unsupported type ${T::class}")
}

覚えておくべき制限

reified が使えるのは inline 関数だけであることを覚えておいてください。クラスやインターフェースに reified 型パラメーターを持たせることはできません。クラスで実行時の型情報が必要な場合は、代わりに KClass プロパティを保持してください。

reified ヘルパーのテスト

reified 関数は簡単にテストできます。ユニットテストで具体的な型引数を指定して呼び出し、出力の型と値を検証してください。クラス参照をモックする必要はありません。

val result: List<String> = """["a","b","c"]""".parseList<String>()
assertEquals(listOf("a","b","c"), result)

クイックチェック

reified 関数について正しい説明はどれでしょうか。

まとめ: 実践的な reified パターン

主なパターン:

  • JSON パース: Class/TypeToken 引数を隠す
  • DI/Service Locator: KClass パラメーターなしで型によって解決する
  • 安全なキャストとコレクションのフィルタリング
  • イベント型によるイベントバスのディスパッチ
  • SharedPreferences/型付きキー・バリューストア
無料で開始

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

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

コース
51
レッスン
203

よくある質問

「実践的なreifiedパターン:パース、DI、シリアライゼーション」レッスンは無料ですか?

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

「実践的なreifiedパターン:パース、DI、シリアライゼーション」で何を学びますか?

reifiedジェネリクスをJSONパース、依存性解決、リフレクションヘルパーに適用します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「実践的なreifiedパターン:パース、DI、シリアライゼーション」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. inline関数:ラムダのオーバーヘッドをなくす
  2. noinlineとcrossinline修飾子
  3. reified型パラメータ:実行時にTへアクセスする
  4. 実践的なreifiedパターン:パース、DI、シリアライゼーション
← Kotlin Academyに戻る