ข้อจำกัด
สิ่งที่คลาสค่าไม่สามารถทำได้
ข้อจำกัด เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ