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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ