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

companion object: สมาชิกคล้าย Static ใน Kotlin

เพิ่ม companion object ให้คลาสเพื่อจำลองเมธอดและค่าคงที่แบบ static

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

ไม่มี static แต่มี companion object

Kotlin ไม่มีคำสำคัญ static แต่มี companion object ที่ประกาศภายในคลาสเพื่อจัดเตรียมสมาชิกระดับคลาสในลักษณะคล้าย static

การประกาศ companion object

ใส่ companion object ไว้ภายในคลาส สมาชิกของมันสามารถเรียกใช้ได้ด้วย ClassName.member

class MathUtils {
    companion object {
        fun square(x: Int) = x * x
    }
}
fun main() {
    println(MathUtils.square(5)) // 25
}

ค่าคงที่ใน companion object

โดยทั่วไปค่าคงที่จะอยู่ใน companion object และมักใช้ const val สำหรับค่าตามตัวอักษรที่คอมไพล์ได้ตั้งแต่เวลาคอมไพล์

class HttpClient {
    companion object {
        const val DEFAULT_TIMEOUT = 5000
        const val USER_AGENT = "MyApp/1.0"
    }
}
fun main() {
    println(HttpClient.DEFAULT_TIMEOUT)
    println(HttpClient.USER_AGENT)
}

companion object ที่มีชื่อ

คุณสามารถตั้งชื่อให้ companion object ได้ ทั้ง ClassName.member และ ClassName.CompanionName.member สามารถใช้งานได้

class Database {
    companion object Factory {
        fun create() = Database()
    }
}
fun main() {
    val db1 = Database.create()       // works
    val db2 = Database.Factory.create() // also works
    println("$db1 / $db2")
}

รูปแบบเมธอดโรงงาน

ใช้ออบเจ็กต์คู่หูเพื่อสร้างอินสแตนซ์พร้อมการตรวจสอบความถูกต้องหรือรูปแบบการสร้างทางเลือก

class User private constructor(val name: String, val email: String) {
    companion object {
        fun create(name: String, email: String): User {
            require(email.contains("@")) { "invalid email" }
            return User(name, email)
        }
    }
}
fun main() {
    val u = User.create("Ada", "ada@example.com")
    println("${u.name} <${u.email}>")
}

การใช้งานอินเทอร์เฟซ

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

interface Loadable<T> { fun load(): T }
class Config(val data: String) {
    companion object : Loadable<Config> {
        override fun load() = Config("loaded data")
    }
}
fun main() {
    println(Config.load().data)
}

@JvmStatic สำหรับการทำงานร่วมกับ Java

ใส่คำอธิบายประกอบ @JvmStatic ให้สมาชิกของออบเจ็กต์คู่หู เพื่อเปิดให้ผู้เรียกจาก Java เห็นสมาชิกเหล่านั้นเป็นเมธอดสแตติกจริง

class Util {
    companion object {
        @JvmStatic
        fun greet(name: String) = "Hello, $name!"
    }
}
fun main() {
    println(Util.greet("Kotlin"))
    // In Java: Util.greet("Java")
}

การเข้าถึงออบเจ็กต์คู่หูโดยตรง

ClassName.Companion อ้างถึงออบเจ็กต์คู่หูโดยตรง ใช้เมื่อส่งออบเจ็กต์นี้เป็นอาร์กิวเมนต์

class Counter {
    companion object {
        fun greet() = "hi from companion"
    }
}
fun main() {
    val ref = Counter.Companion
    println(ref.greet())
}

ออบเจ็กต์คู่หูกับระดับบนสุด

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

// File-level — usually cleaner:
fun greet(name: String) = "Hi, $name!"
// Versus:
class Greeter { companion object { fun greet(n: String) = "Hi, $n!" } }
fun main() {
    println(greet("Ada"))
    println(Greeter.greet("Ada"))
}

ออบเจ็กต์คู่หูหนึ่งรายการต่อคลาส

คลาสหนึ่งมีออบเจ็กต์คู่หูได้ไม่เกินหนึ่งรายการ หากจำเป็น ออบเจ็กต์ปกติภายในสามารถเก็บสถานะที่ใช้ร่วมกันเพิ่มเติมได้

class Service {
    companion object {
        val version = "1.0"
    }
    object InternalHelper { fun log() = println("internal") }
}
fun main() {
    println(Service.version)
    Service.InternalHelper.log()
}

ฟังก์ชันส่วนขยายของออบเจ็กต์คู่หู

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

class Lib {
    companion object
}
fun Lib.Companion.helper() = "added later"
fun main() {
    println(Lib.helper())
}

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

สิ่งใดใน Kotlin ที่เทียบเท่ากับสมาชิก static ของ Java

สรุปทบทวน

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

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

บทเรียน “companion object: สมาชิกคล้าย Static ใน Kotlin” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “companion object: สมาชิกคล้าย Static ใน Kotlin”

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

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

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

บทเรียน “companion object: สมาชิกคล้าย Static ใน Kotlin” ใช้เวลานานแค่ไหน

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

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

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

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

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