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

Enum กับ when

จัดการให้ครอบคลุมทุกกรณี

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

ชนิดแจกแจงค่าเหมาะกับนิพจน์เงื่อนไข

นิพจน์ when เป็นวิธีธรรมชาติในการแยกกรณีตามชนิดแจกแจงค่า โดยค่าคงที่แต่ละค่าจะมีแขนงของตนเอง

enum class Light { RED, YELLOW, GREEN }

fun action(l: Light) = when (l) {
    Light.RED -> "Stop"
    Light.YELLOW -> "Slow"
    Light.GREEN -> "Go"
}

fun main() {
    println(action(Light.GREEN))
}

ความครอบคลุมครบทุกกรณี

เมื่อใช้ when เป็นนิพจน์กับชนิดแจกแจงค่าและครอบคลุมค่าคงที่ ทุกค่า ก็ไม่จำเป็นต้องมีแขนง else คอมไพเลอร์จะตรวจสอบความครบถ้วนให้

enum class Coin { HEADS, TAILS }

fun flip(c: Coin) = when (c) {
    Coin.HEADS -> "Win"
    Coin.TAILS -> "Lose"
}

fun main() {
    println(flip(Coin.HEADS))
}

คอมไพเลอร์คอยตรวจสอบให้

หากภายหลังคุณเพิ่มค่าคงที่ใหม่แต่ลืมเพิ่มแขนง คอมไพเลอร์จะแจ้งข้อผิดพลาด วิธีนี้ทำให้การปรับแก้ชนิดแจกแจงค่าร่วมกับ when ปลอดภัยมาก

enum class Size { S, M, L }

fun label(s: Size) = when (s) {
    Size.S -> "Small"
    Size.M -> "Medium"
    Size.L -> "Large"
}

fun main() {
    println(label(Size.M))
}

การนำเข้าค่าคงที่

คุณสามารถนำเข้าสมาชิกของชนิดแจกแจงค่าเพื่อไม่ต้องเขียนคำนำหน้าชนิดข้อมูลภายใน when ทำให้แขนงสั้นลง

enum class Dir { UP, DOWN }

import Dir.UP
import Dir.DOWN

fun move(d: Dir) = when (d) {
    UP -> "y + 1"
    DOWN -> "y - 1"
}

fun main() {
    println(move(Dir.UP))
}

การจัดกลุ่มแขนง

ค่าคงที่หลายค่าสามารถใช้แขนงเดียวกันได้ โดยระบุค่าคงที่เหล่านั้นคั่นด้วยจุลภาค

enum class Day { MON, TUE, WED, SAT, SUN }

fun kind(d: Day) = when (d) {
    Day.SAT, Day.SUN -> "Weekend"
    else -> "Weekday"
}

fun main() {
    println(kind(Day.SAT))
}

การส่งคืนชนิดข้อมูลที่แตกต่างกัน

แขนงแต่ละแขนงสามารถสร้างค่าได้ และนิพจน์ when ทั้งหมดจะกลายเป็นค่านั้น

enum class Tier { FREE, PRO }

fun limit(t: Tier): Int = when (t) {
    Tier.FREE -> 10
    Tier.PRO -> 1000
}

fun main() {
    println(limit(Tier.PRO))
}

นิพจน์เงื่อนไขโดยไม่มีอาร์กิวเมนต์

คุณสามารถแยกกรณีตามเงื่อนไขได้เช่นกัน แต่สำหรับชนิดแจกแจงค่า รูปแบบที่ระบุค่าที่ตรวจสอบจะกระชับกว่าและเปิดให้ตรวจสอบความครอบคลุมครบทุกกรณีได้

enum class Mood { HAPPY, SAD }

fun emoji(m: Mood) = when (m) {
    Mood.HAPPY -> ":)"
    Mood.SAD -> ":("
}

fun main() {
    println(emoji(Mood.HAPPY))
}

ผลข้างเคียงในแขนง

แขนงสามารถดำเนินคำสั่งต่าง ๆ ได้ ไม่จำเป็นต้องส่งคืนค่าเพียงอย่างเดียว

enum class Cmd { START, STOP }

fun run(c: Cmd) {
    when (c) {
        Cmd.START -> println("Starting...")
        Cmd.STOP -> println("Stopping...")
    }
}

fun main() {
    run(Cmd.START)
}

หลีกเลี่ยง else เมื่อทำได้

การใช้ else จะทำให้การตรวจสอบความครอบคลุมครบทุกกรณีหมดประโยชน์: ค่าคงที่ใหม่จะไหลไปยัง else อย่างเงียบ ๆ ควรใช้แขนงที่ระบุค่าคงที่อย่างชัดเจนสำหรับชนิดแจกแจงค่า

enum class State { ON, OFF }

fun text(s: State) = when (s) {
    State.ON -> "on"
    State.OFF -> "off"
}

fun main() {
    println(text(State.OFF))
}

ตัวจัดเส้นทางที่สมจริง

การกำหนดสิทธิ์ตามบทบาทผู้ใช้เป็นการใช้ when ที่ครอบคลุมทุกกรณีได้อย่างเหมาะสม

enum class Role { ADMIN, USER, GUEST }

fun canDelete(r: Role) = when (r) {
    Role.ADMIN -> true
    Role.USER -> false
    Role.GUEST -> false
}

fun main() {
    println(canDelete(Role.ADMIN))
}

การใช้ร่วมกับพร็อพเพอร์ตี

คุณสามารถแยกกรณีตามชนิดแจกแจงค่า และใช้พร็อพเพอร์ตีของค่าคงที่ภายในแขนงต่าง ๆ ได้

enum class Coin(val cents: Int) { PENNY(1), DIME(10) }

fun describe(c: Coin) = when (c) {
    Coin.PENNY -> "Worth ${c.cents}"
    Coin.DIME -> "Worth ${c.cents}"
}

fun main() {
    println(describe(Coin.DIME))
}

ตรวจสอบความเข้าใจ

ตรวจสอบความเข้าใจของคุณเกี่ยวกับการใช้ชนิดแจกแจงค่าร่วมกับนิพจน์เงื่อนไข

สรุป

คุณได้เรียนรู้การใช้ชนิดแจกแจงค่าร่วมกับ when:

  • when ที่ใช้กับชนิดแจกแจงค่าสามารถครอบคลุมครบทุกกรณีได้โดยไม่ต้องมี else
  • คอมไพเลอร์บังคับให้ครอบคลุมค่าคงที่ทุกค่า
  • จัดกลุ่มค่าคงที่ด้วยจุลภาค และแขนงแต่ละแขนงจะสร้างค่า
  • หลีกเลี่ยง else เพื่อคงความปลอดภัยจากการตรวจสอบความครอบคลุมครบทุกกรณี
enum class Light { RED, GREEN }

fun go(l: Light) = when (l) {
    Light.RED -> false
    Light.GREEN -> true
}

fun main() {
    println(go(Light.GREEN))
}

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

บทเรียน “Enum กับ when” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “Enum กับ when”

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

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

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

บทเรียน “Enum กับ when” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การกำหนด Enum
  2. คุณสมบัติและเมธอดของ Enum
  3. Enum กับ when
  4. ค่าและลำดับของ Enum
← กลับไปที่ Kotlin Academy