0Pricing
Kotlin Academy · บทเรียน

รูปแบบ reified เชิงปฏิบัติ: การแยกวิเคราะห์ DI และการทำซีเรียลไลซ์

ประยุกต์ใช้ generic แบบ reified กับการแยกวิเคราะห์ JSON การแก้การพึ่งพา และตัวช่วย reflection

รูปแบบ reified เชิงปฏิบัติ: การแยกวิเคราะห์ DI และการทำซีเรียลไลซ์ เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

กรณีใช้งานหลักสามกรณี

พารามิเตอร์ชนิดข้อมูลแบบ reified เหมาะอย่างยิ่งกับรูปแบบการเขียน Kotlin ที่พบเป็นประจำสามรูปแบบ ได้แก่ การแยกวิเคราะห์ 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() อาศัย serializer() ซึ่งเป็นฟังก์ชันแบบ reified inline

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

รูปแบบที่ 2 — Service Locator / DI

ตัวระบุตำแหน่งบริการอย่างง่ายสามารถแก้ไขการพึ่งพาตามชนิดข้อมูลได้ โดยไม่ต้องให้ผู้เรียกส่ง 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
    }
}

การดึง ViewModel ใน Android

รูปแบบ reified ใน Android ที่ใช้กันบ่อยที่สุด:

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 / ที่จัดเก็บคู่คีย์-ค่าแบบมีชนิดข้อมูล

คำถามที่พบบ่อย

บทเรียน “รูปแบบ reified เชิงปฏิบัติ: การแยกวิเคราะห์ DI และการทำซีเรียลไลซ์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “รูปแบบ reified เชิงปฏิบัติ: การแยกวิเคราะห์ DI และการทำซีเรียลไลซ์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบ reified เชิงปฏิบัติ: การแยกวิเคราะห์ DI และการทำซีเรียลไลซ์”

ประยุกต์ใช้ generic แบบ reified กับการแยกวิเคราะห์ JSON การแก้การพึ่งพา และตัวช่วย reflection คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “รูปแบบ reified เชิงปฏิบัติ: การแยกวิเคราะห์ DI และการทำซีเรียลไลซ์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม

ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ฟังก์ชัน inline: ลดต้นทุนของ Lambda
  2. ตัวปรับแต่ง noinline และ crossinline
  3. พารามิเตอร์ชนิด reified: เข้าถึง T ขณะรันไทม์
  4. รูปแบบ reified เชิงปฏิบัติ: การแยกวิเคราะห์ DI และการทำซีเรียลไลซ์
← กลับไปที่ Kotlin Academy