Skip to Content

Companion Object trong Kotlin

1. Giới thiệu

Companion object là cách Kotlin thay thế static members trong Java.

2. Khai báo cơ bản

class MyClass { companion object { const val CONSTANT = "Hello" fun create(): MyClass { return MyClass() } } } fun main() { println(MyClass.CONSTANT) // Hello val instance = MyClass.create() }

3. Named Companion Object

class User private constructor(val name: String) { companion object Factory { fun fromName(name: String) = User(name) fun fromEmail(email: String) = User(email.substringBefore("@")) } } fun main() { val user1 = User.fromName("Alice") val user2 = User.Factory.fromEmail("bob@email.com") }

4. Companion với Interface

interface Factory<T> { fun create(): T } class MyClass private constructor() { companion object : Factory<MyClass> { override fun create() = MyClass() } } fun main() { val factory: Factory<MyClass> = MyClass val instance = factory.create() }

5. Extension trên Companion

class Person(val name: String) { companion object } fun Person.Companion.fromJson(json: String): Person { // Parse JSON return Person(json) } fun main() { val person = Person.fromJson("{name: 'Alice'}") }

6. Companion cho Singleton-like

class Logger private constructor() { fun log(message: String) = println("[LOG] $message") companion object { private val instance = Logger() fun getInstance() = instance } } fun main() { Logger.getInstance().log("Hello") }

7. const vs val trong Companion

class Config { companion object { const val MAX_SIZE = 100 // Compile-time constant val DEFAULT_NAME = "Default" // Runtime value // const chỉ cho primitive và String // const val list = listOf(1, 2) // Error! } }

8. @JvmStatic annotation

class Utils { companion object { @JvmStatic fun helper() = println("Helper") } } // Từ Java có thể gọi: Utils.helper() // Thay vì: Utils.Companion.helper()

9. So sánh với Object Declaration

// Companion object - thuộc về class class MyClass { companion object { fun foo() = println("Companion") } } // Object declaration - standalone singleton object MySingleton { fun bar() = println("Singleton") } fun main() { MyClass.foo() // Companion MySingleton.bar() // Singleton }

10. Ví dụ thực tế

data class User(val id: Int, val name: String) { companion object { const val TABLE_NAME = "users" fun fromMap(map: Map<String, Any>): User { return User( id = map["id"] as Int, name = map["name"] as String ) } fun empty() = User(0, "") } } fun main() { val user = User.fromMap(mapOf("id" to 1, "name" to "Alice")) println(user) }

📝 Tóm tắt

  • companion object thay thế static trong Java
  • Có thể named hoặc anonymous
  • Có thể implement interfaces
  • const val cho compile-time constants
  • @JvmStatic cho Java interop
  • Mỗi class chỉ có một companion object
Last updated on