คลาสค่าแบบอินไลน์
ห่อหุ้มข้อมูลโดยไม่เพิ่มภาระ
คลาสค่าแบบอินไลน์ เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
ปัญหาการห่อหุ้ม
การห่อชนิดพื้นฐานไว้ในคลาสช่วยเพิ่มความปลอดภัยด้านชนิดข้อมูล แต่โดยปกติจะมีต้นทุนจากการจองหน่วยความจำบนฮีพ คลาสค่าช่วยให้ได้ความปลอดภัยดังกล่าว ขณะที่คอมไพเลอร์จะลบตัวห่อหุ้มออกเมื่อทำได้
การประกาศคลาสค่า
กำกับคลาสด้วย @JvmInline value class และให้มีคุณสมบัติเพียงหนึ่งรายการในตัวสร้างหลัก คลาสนี้จะทำงานเสมือนเป็นชนิดข้อมูลที่แยกต่างหาก
@JvmInline
value class Password(val value: String)
fun main() {
val p = Password("secret")
println(p.value)
}ชนิดข้อมูลที่แยกต่างหาก
ต่างจากนามแฝงชนิดข้อมูล คลาสค่าเป็นชนิดข้อมูลแยกต่างหาก คุณไม่สามารถส่ง String ดิบไปยังตำแหน่งที่ต้องการ Password โดยไม่ตั้งใจได้
@JvmInline
value class Password(val value: String)
fun login(p: Password) = println("login with " + p.value)
fun main() {
login(Password("hunter2"))
}ไม่มีต้นทุนเพิ่ม
ขณะทำงาน คอมไพเลอร์มักจะแทรกค่าพื้นฐานไว้โดยตรง จึงไม่มีการจัดสรรออบเจ็กต์เพิ่มเติม ในเส้นทางการทำงานส่วนใหญ่ Password จะแทนด้วย String ธรรมดา
@JvmInline
value class Meters(val amount: Double)
fun main() {
val d = Meters(5.0)
println(d.amount) // stored inline as a Double
}เมธอดและคุณสมบัติ
คลาสค่าสามารถมีฟังก์ชันและคุณสมบัติที่คำนวณได้เช่นเดียวกับคลาสทั่วไป
@JvmInline
value class Celsius(val degrees: Double) {
fun toFahrenheit() = degrees * 9 / 5 + 32
}
fun main() {
println(Celsius(100.0).toFahrenheit())
}บล็อกเริ่มต้นสำหรับตรวจสอบความถูกต้อง
บล็อก init ช่วยให้คุณตรวจสอบค่าที่ห่อหุ้มไว้ขณะสร้าง ทำให้มั่นใจได้ว่าอินสแตนซ์ทุกตัวถูกต้อง
@JvmInline
value class Percentage(val value: Int) {
init {
require(value in 0..100) { "out of range" }
}
}
fun main() {
println(Percentage(75).value)
}คุณสมบัติที่คำนวณ
คุณสามารถเพิ่มคุณสมบัติที่คำนวณจากค่าที่จัดเก็บไว้เพียงค่าเดียวได้ ทำให้ตรรกะอยู่ใกล้กับชนิดข้อมูล
@JvmInline
value class Seconds(val value: Int) {
val asMinutes: Double get() = value / 60.0
}
fun main() {
println(Seconds(120).asMinutes)
}การใช้งานอินเทอร์เฟซ
คลาสค่าสามารถใช้งานอินเทอร์เฟซได้ ทำให้ใช้งานแบบพหุรูปได้ โปรดทราบว่าเมื่อปฏิบัติต่อคลาสค่าในฐานะชนิดอินเทอร์เฟซ อาจทำให้ต้องห่อค่าเป็นออบเจ็กต์
interface Describable {
fun describe(): String
}
@JvmInline
value class Money(val cents: Int) : Describable {
override fun describe() = "$" + cents / 100.0
}
fun main() {
println(Money(1599).describe())
}การห่อค่าเป็นออบเจ็กต์เกิดขึ้นเมื่อใด
ตัวห่อหุ้มจะกลับมาอีกครั้งเมื่อค่าเป็นชนิดที่รับค่าว่างได้ เป็นอินเทอร์เฟซ หรืออยู่ในคอลเลกชันทั่วไป ในกรณีเหล่านี้คอมไพเลอร์จะสร้างออบเจ็กต์จริงขึ้นมา ซึ่งยังคงถูกต้อง เพียงมีประสิทธิภาพลดลง
@JvmInline
value class Id(val raw: Int)
fun main() {
val direct = Id(1) // inlined
val boxed: Id? = Id(2) // boxed because nullable
println("" + direct.raw + " " + boxed?.raw)
}คลาสค่าเทียบกับคลาสข้อมูล
data class จะจัดสรรออบเจ็กต์เสมอและเก็บคุณสมบัติได้หลายรายการ ส่วน value class เก็บได้เพียงหนึ่งรายการและมุ่งให้ไม่มีต้นทุนเพิ่ม ใช้คลาสค่าสำหรับตัวห่อหุ้มบาง ๆ ที่ปลอดภัยด้านชนิดข้อมูลและครอบค่ารายการเดียว
เหตุผลที่เรื่องนี้สำคัญ
คลาสค่าช่วยให้คุณสามารถ:
- ป้องกันการสลับพารามิเตอร์ที่มีชนิดเดียวกัน
- ผูกการตรวจสอบความถูกต้องเข้ากับค่าพื้นฐาน
- แทบไม่ต้องเสียต้นทุนขณะทำงาน
คลาสค่าเป็นคำตอบที่ปลอดภัยด้านชนิดข้อมูลในกรณีที่นามแฝงชนิดข้อมูลยังไม่เพียงพอ
ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับคลาสค่าแบบแทรกค่า
ทบทวน
คุณได้เรียนรู้เกี่ยวกับคลาสค่าแบบแทรกค่า:
- ประกาศด้วย
@JvmInline value classและมีคุณสมบัติหนึ่งรายการ - เป็นชนิดข้อมูลที่แยกต่างหากและโดยทั่วไปไม่มีต้นทุนเพิ่ม
- รองรับเมธอด คุณสมบัติที่คำนวณ และการตรวจสอบด้วย
init - การห่อค่าเป็นออบเจ็กต์เกิดขึ้นเมื่อเป็นค่าว่างได้ เป็นชนิดทั่วไป หรือใช้งานเป็นอินเทอร์เฟซ
ถัดไป: กรณีการใช้งานจริง
คำถามที่พบบ่อย
บทเรียน “คลาสค่าแบบอินไลน์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “คลาสค่าแบบอินไลน์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “คลาสค่าแบบอินไลน์”
ห่อหุ้มข้อมูลโดยไม่เพิ่มภาระ คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “คลาสค่าแบบอินไลน์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม
ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ชื่อแทนชนิดข้อมูล
- คลาสค่าแบบอินไลน์
- กรณีการใช้งาน
- ข้อจำกัด