ออบเจ็กต์นิรนามและนิพจน์ออบเจ็กต์
ใช้นิพจน์ออบเจ็กต์เพื่อสร้างการใช้งาน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การประกาศ object: Singleton ของ Kotlin
- companion object: สมาชิกคล้าย Static ใน Kotlin
- ออบเจ็กต์นิรนามและนิพจน์ออบเจ็กต์
- เมธอด Factory ด้วย companion object