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 objectthay thế static trong Java- Có thể named hoặc anonymous
- Có thể implement interfaces
const valcho compile-time constants@JvmStaticcho Java interop- Mỗi class chỉ có một companion object
Last updated on