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

คลาสค่าแบบอินไลน์

ห่อหุ้มข้อมูลโดยไม่เพิ่มภาระ

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

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

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