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

ข้อจำกัด

สิ่งที่คลาสค่าไม่สามารถทำได้

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

การรู้ขอบเขตการใช้งาน

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

คุณสมบัติเพียงหนึ่งรายการ

คลาสค่าห่อหุ้มค่าเพียงหนึ่งค่า หากต้องการรวมหลายฟิลด์ คุณต้องใช้คลาสทั่วไปหรือ data class

// @JvmInline value class Range(val lo: Int, val hi: Int) // not allowed

data class Range(val lo: Int, val hi: Int)

fun main() {
    println(Range(1, 10))
}

ไม่มีสถานะเริ่มต้นนอกเหนือจากค่า

คลาสค่าไม่สามารถมีฟิลด์เบื้องหลังอื่นนอกเหนือจากคุณสมบัติเดียวในตัวสร้างได้ ไม่อนุญาตให้มีสถานะ var เพิ่มเติมที่มีฟิลด์เบื้องหลัง

@JvmInline
value class Counter(val value: Int) {
    // val cached: Int = value * 2  // not allowed: extra backing field
    val doubled: Int get() = value * 2  // computed is fine
}

fun main() {
    println(Counter(3).doubled)
}

ไม่มีการสืบทอด

คลาสค่ามี final โดยปริยาย ไม่สามารถขยายคลาสอื่นและไม่สามารถถูกขยายได้ แต่สามารถใช้งานอินเทอร์เฟซได้เท่านั้น

interface Named { val label: String }

@JvmInline
value class Tag(val text: String) : Named {
    override val label: String get() = text
}

fun main() {
    println(Tag("urgent").label)
}

ต้นทุนจากการห่อค่าเป็นออบเจ็กต์กลับมา

คำรับรองว่าจะไม่มีต้นทุนเพิ่มจะหายไปเมื่อใช้ค่าเป็นชนิดที่รับค่าว่างได้ ชนิดทั่วไป หรือชนิดอินเทอร์เฟซ จากนั้นคอมไพเลอร์จะห่อค่าเป็นออบเจ็กต์จริง

@JvmInline
value class Id(val raw: Int)

fun main() {
    val list: List<Id> = listOf(Id(1), Id(2)) // boxed inside the list
    println(list.map { it.raw })
}

ไม่มีเอกลักษณ์ของออบเจ็กต์

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

@JvmInline
value class Code(val value: Int)

fun main() {
    val a = Code(5)
    val b = Code(5)
    println(a == b)   // structural equality works
}

ไม่สามารถใช้การกำหนดค่าในภายหลังหรือการมอบหมายได้

คุณไม่สามารถใช้ lateinit กับค่าพื้นฐาน และคลาสค่าไม่รองรับการมอบหมายคุณสมบัติให้กับฟิลด์เดียวของคลาส ค่านี้ต้องกำหนดในตัวสร้าง

@JvmInline
value class Slug(val value: String)

fun main() {
    val s = Slug("hello-world") // must be provided up front
    println(s.value)
}

การเปลี่ยนชื่อบน JVM

บน JVM ฟังก์ชันที่รับพารามิเตอร์ชนิดคลาสค่าจะได้รับชื่อที่ถูกเปลี่ยนในไบต์โค้ดเพื่อป้องกันชื่อซ้ำ ทำให้การทำงานร่วมกับ Java ซับซ้อนขึ้น ผู้เรียกจาก Java อาจมองเห็นฟังก์ชันเหล่านี้ได้ไม่ชัดเจน

@JvmInline
value class Hz(val value: Int)

fun tune(freq: Hz) = freq.value

fun main() {
    println(tune(Hz(440))) // simple from Kotlin; mangled from Java
}

ไม่เหมาะกับตัวห่อหุ้มหลายฟิลด์

หากคุณเริ่มต้องการคุณสมบัติสองรายการ คลาสค่าก็ไม่ใช่เครื่องมือที่เหมาะสม ให้เลือกใช้ data class และยอมรับการจัดสรรออบเจ็กต์เพื่อแลกกับโครงสร้างที่สมบูรณ์ยิ่งขึ้น

data class Coordinate(val lat: Double, val lng: Double)

fun main() {
    println(Coordinate(41.0, 29.0))
}

สรุปข้อจำกัด

คลาสค่าไม่สามารถ:

  • มีคุณสมบัติมากกว่าหนึ่งรายการ
  • มีฟิลด์เบื้องหลังเพิ่มเติมหรือ lateinit
  • สืบทอดจากคลาสอื่นหรือให้คลาสอื่นสืบทอด
  • มีเอกลักษณ์เชิงอ้างอิง
  • หลีกเลี่ยงการห่อค่าเป็นออบเจ็กต์ได้เสมอ

การเลือกอย่างเหมาะสม

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

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

ทดสอบความเข้าใจเกี่ยวกับข้อจำกัดของคลาสค่า

ทบทวน

คุณได้เรียนรู้ข้อจำกัดของคลาสค่า:

  • มีคุณสมบัติเดียวและไม่มีฟิลด์เบื้องหลังเพิ่มเติม
  • ไม่มีการสืบทอดและไม่มีเอกลักษณ์ของออบเจ็กต์
  • การห่อค่าเป็นออบเจ็กต์กลับมาเมื่อใช้เป็นค่าว่างได้ ชนิดทั่วไป หรืออินเทอร์เฟซ
  • การเปลี่ยนชื่อบน JVM ทำให้การทำงานร่วมกับ Java ซับซ้อนขึ้น

เลือกเครื่องมือให้ตรงกับความต้องการ

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

บทเรียน “ข้อจำกัด” ฟรีหรือไม่

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

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

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

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

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

บทเรียน “ข้อจำกัด” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ชื่อแทนชนิดข้อมูล
  2. คลาสค่าแบบอินไลน์
  3. กรณีการใช้งาน
  4. ข้อจำกัด
← กลับไปที่ Kotlin Academy