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

ออบเจ็กต์นิรนามและนิพจน์ออบเจ็กต์

ใช้นิพจน์ออบเจ็กต์เพื่อสร้างการใช้งาน interface แบบใช้ครั้งเดียว

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

นิพจน์ออบเจ็กต์

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

การใช้งานอินเทอร์เฟซแบบไม่ระบุชื่อ

ใช้ object : Interface { ... } เพื่อสร้างการใช้งานแบบแทรกในตำแหน่งนั้น

interface ClickListener {
    fun onClick(): String
}
fun main() {
    val listener = object : ClickListener {
        override fun onClick() = "clicked!"
    }
    println(listener.onClick())
}

คลาสแบบไม่ระบุชื่อที่มีสถานะ

ออบเจ็กต์แบบไม่ระบุชื่อสามารถเก็บสถานะและมีหลายเมธอดได้

fun main() {
    val counter = object {
        var count = 0
        fun inc() { count++ }
        fun show() = println("count = $count")
    }
    counter.inc(); counter.inc(); counter.inc()
    counter.show()
}

ชนิดของออบเจ็กต์แบบไม่ระบุชื่อ

ชนิดของออบเจ็กต์แบบไม่ระบุชื่อจะถูกอนุมาน เมื่อประกาศในระดับฟังก์ชัน คุณจะยังเข้าถึงสมาชิกแบบกำหนดเองของออบเจ็กต์นั้นได้

fun main() {
    val pair = object {
        val left = "L"
        val right = "R"
    }
    println("${pair.left} and ${pair.right}")
}

การเปิดเผยชนิดแบบไม่ระบุชื่อ

หากฟังก์ชันส่งคืนออบเจ็กต์แบบไม่ระบุชื่อด้วยชนิดที่อนุมาน ผู้เรียกจะเห็นเพียงชนิดแม่เท่านั้น จึงไม่สามารถเข้าถึงสมาชิกเพิ่มเติมของออบเจ็กต์แบบไม่ระบุชื่อจากภายนอกได้

fun makeListener() = object {
    fun greet() = "hello"
}
fun main() {
    val l = makeListener()
    println(l.greet()) // OK — same compilation unit
}

หลายอินเทอร์เฟซ

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

interface Closeable { fun close() }
interface Flushable { fun flush() }
fun main() {
    val resource = object : Closeable, Flushable {
        override fun close() = println("closed")
        override fun flush() = println("flushed")
    }
    resource.flush()
    resource.close()
}

การสืบทอดจากคลาส

ออบเจ็กต์แบบไม่ระบุชื่อสามารถสืบทอดจากคลาสแบบเปิด พร้อมเขียนทับสมาชิกได้

open class Animal(val name: String) {
    open fun speak() = "$name makes a sound"
}
fun main() {
    val pet = object : Animal("Rex") {
        override fun speak() = "$name barks!"
    }
    println(pet.speak())
}

การจับตัวแปรจากขอบเขตภายนอก

ออบเจ็กต์แบบไม่ระบุชื่อจะปิดล้อมตัวแปรในขอบเขตภายนอก ทำให้สามารถอ่านและแก้ไขตัวแปรเหล่านั้นได้ ซึ่งต่างจากข้อกำหนดของ Java ที่ต้องใช้ final

fun main() {
    var log = mutableListOf<String>()
    val recorder = object {
        fun record(s: String) { log.add(s) }
    }
    recorder.record("event 1")
    recorder.record("event 2")
    println(log)
}

ควรใช้ออบเจ็กต์แบบไม่ระบุชื่อเมื่อใด

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

fun main() {
    val nums = listOf(3, 1, 4, 1, 5, 9, 2, 6)
    val sorted = nums.sortedWith(object : Comparator<Int> {
        override fun compare(a: Int, b: Int) = b - a // descending
    })
    println(sorted)
}

ควรใช้แลมบ์ดาเมื่อทำได้

หากอินเทอร์เฟซมีเมธอดนามธรรมเพียงรายการเดียว (SAM) แลมบ์ดาจะกระชับและอ่านง่ายกว่านิพจน์ออบเจ็กต์

fun main() {
    val nums = listOf(3, 1, 4, 1, 5, 9)
    // Old way:
    val sorted1 = nums.sortedWith(object : Comparator<Int> {
        override fun compare(a: Int, b: Int) = b - a
    })
    // New way — SAM conversion:
    val sorted2 = nums.sortedWith(Comparator { a, b -> b - a })
    println("$sorted1 / $sorted2")
}

ออบเจ็กต์แบบไม่ระบุชื่อกับออบเจ็กต์ที่ประกาศชื่อ

ใช้ object Name สำหรับซิงเกิลตันที่มีชื่อ ใช้ object : Type ในนิพจน์สำหรับอินสแตนซ์แบบไม่ระบุชื่อที่ใช้เพียงครั้งเดียว

// Named singleton (one instance, accessed globally)
object GlobalLogger { fun log(m: String) = println("[L] $m") }
// Anonymous (created at expression evaluation)
fun main() {
    val local = object { fun hi() = "hi" }
    GlobalLogger.log("hello")
    println(local.hi())
}

ตรวจสอบอย่างรวดเร็ว

ไวยากรณ์ใดใช้สร้างอินสแตนซ์แบบไม่ระบุชื่อที่ใช้งานอินเทอร์เฟซแบบแทรกในตำแหน่งนั้น

สรุปทบทวน

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

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

บทเรียน “ออบเจ็กต์นิรนามและนิพจน์ออบเจ็กต์” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ออบเจ็กต์นิรนามและนิพจน์ออบเจ็กต์”

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

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

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

บทเรียน “ออบเจ็กต์นิรนามและนิพจน์ออบเจ็กต์” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การประกาศ object: Singleton ของ Kotlin
  2. companion object: สมาชิกคล้าย Static ใน Kotlin
  3. ออบเจ็กต์นิรนามและนิพจน์ออบเจ็กต์
  4. เมธอด Factory ด้วย companion object
← กลับไปที่ Kotlin Academy