object sa Kotlin: ano ito, syntax at paggamit ng singleton object

May-akda: IT Sectr Nai-publish: 2026-06-21 Oras ng pagbabasa: 9 min

object sa Kotlin — ay isang deklaratibong paraan ng paggawa ng singleton object na may tamad na inisyalisasyon at thread-safety bilang default. Pinapalitan ng keyword na object ang buong klase na may iisang instance at ginagamit para magdeklara ng singleton, companion object, anonymous object, at static na utility. Ayon sa JetBrains Kotlin Documentation (2026), ang object declaration ay ang pinakasimple at pinakaligtas na paraan ng pag-implement ng singleton sa mundo ng JVM.

Mga Pangunahing Punto

  • object — keyword para magdeklara ng singleton class na may iisang instance
  • Tamad na inisyalisasyon — object ay nilikha sa unang pag-access, hindi sa pag-load ng klase
  • Companion object — analog ng static na miyembro sa Kotlin (walang static keyword)
  • Object expression — anonymous object para sa pag-override ng mga method on-the-fly
  • Thread-safety — inisyalisasyon ng object ay garantisadong thread-safe

Ano ang object sa Kotlin?

object sa Kotlin — ay isang espesyal na anyo ng deklarasyon na sabay na nagdedefine ng klase at lumilikha ng nag-iisang instance nito (singleton). Ito ay hybrid ng class declaration at instance creation sa iisang konstruksyon.

Sa Java para gumawa ng singleton, kailangan mong sumulat ng pribadong konstruktor, static na field, getInstance method, at pangasiwaan ang thread-safety. Ginagawa ito ng Kotlin object sa isang linya ng code: object MySingleton { }. Awtomatikong bumubuo ang compiler ng thread-safe na tamad na inisyalisasyon gamit ang static initializer mechanism sa JVM bytecode.

Ayon sa Kotlin Language Specification (2026), ang object declaration ay nagko-compile sa isang final class na may pribadong konstruktor at static na field na INSTANCE, na na-initialize sa isang static block. Ginagarantiya nito ang atomicidad ng inisyalisasyon sa antas ng JVM.

Singleton object (object declaration)

Object declaration (singleton object) ay idinedeklara gamit ang keyword na object, na sinusundan ng pangalan. Ang katawan ng object ay maaaring maglaman ng mga property, method, init block, at magmana mula sa ibang mga klase o interface.

kotlin
object DatabaseManager {
    private val connection: String = "jdbc:postgresql://localhost:5432/app"
    
    fun query(sql: String): List<Map<String, Any>> {
        // pag-execute ng query
        return emptyList()
    }
}

// Paggamit
DatabaseManager.query("SELECT * FROM users")

Inisyalisasyon ng DatabaseManager ay nangyayari sa sandali ng unang pag-access — tamad at thread-safe. Walang karagdagang code para sa synchronisasyon ang kinakailangan.

Pamana para sa object

Object ay maaaring magmana mula sa ordinaryong klase at interface. Pinapayagan nito ang paggamit ng object bilang implementasyon ng abstract class o interface na may iisang instance.

kotlin
interface Logger {
    fun log(message: String)
}

object ConsoleLogger : Logger {
    override fun log(message: String) {
        println("[LOG] $message")
    }
}

Companion object

companion object — ay isang espesyal na object na idinedeklara sa loob ng isang klase gamit ang keyword na companion. Pinapalitan nito ang static na miyembro sa Kotlin, dahil walang static keyword sa wika.

kotlin
class ApiClient {
    companion object {
        private const val BASE_URL = "https://api.example.com"
        
        fun create(): ApiClient {
            return ApiClient()
        }
    }
}

// Pagtawag nang hindi lumilikha ng instance ng ApiClient
val client = ApiClient.create()

Companion object ay maaaring magkaroon ng pangalan (default Companion), mag-implement ng mga interface, at mapalawak sa pamamagitan ng extension functions. Hindi tulad ng static na method sa Java, ang companion object ay isang ganap na object na maaaring ipasa bilang argumento o i-store sa isang variable.

Ayon sa Kotlin Best Practices (2026), ang companion object ay ginagamit para sa factory method, constants, at static na utility na nauugnay sa klase. Inirerekomenda na iwasan ang labis na paggamit ng companion object — para sa hindi nauugnay na utility, mas mainam na gumamit ng top-level function.

Annotation na @JvmStatic

Para sa compatibility sa Java, ang mga method ng companion object ay maaaring i-annotate ng @JvmStatic. Bumubuo ito ng tunay na static na method sa JVM bytecode, na accessible mula sa Java code nang walang Companion syntax.

Object expressions (anonymous object)

Object expression — ay isang anonymous object na nilikha on-the-spot para mag-override ng mga method ng klase o interface nang hindi nagdedeklara ng hiwalay na pinangalanang klase.

kotlin
val handler = object : Runnable {
    override fun run() {
        println("Na-execute ang task")
    }
}

thread(handler)

Object expressions ay naiiba sa object declaration dahil gumagawa sila ng bagong instance sa bawat execution. Hindi sila singleton at walang pangalan. Ang anonymous object ay maaaring kumuha ng mga variable mula sa closure, tulad ng mga lambda.

Hindi tulad sa Java, kung saan ang anonymous class ay maaari lamang magmana ng isang uri, ang Kotlin object expression ay maaaring magmana ng maramihang uri nang sabay-sabay.

kotlin
interface Clickable {
    fun click()
}

abstract class View {
    abstract fun render()
}

val button = object : View(), Clickable {
    override fun render() = println("Pag-render ng button")
    override fun click() = println("Na-click ang button")
}

Mga praktikal na senaryo ng paggamit

Object — isa sa pinaka-versatile na konstruksyon ng Kotlin, ginagamit sa maraming senaryo.

Singleton repository

Sa mga proyekto ng Android, ang object ay kadalasang ginagamit para magdeklara ng Repository, kung saan hindi kailangan ng maraming instance. Ginagarantiya ng iisang instance ang consistency ng data.

kotlin
object UserRepository {
    fun getUser(id: Int): User? {
        // pagkuha ng user
        return null
    }
}

Factory method sa pamamagitan ng companion object

Companion object na may factory method — alternatibo sa maramihang konstruktor. Ang pinangalanang factory method ay ginagawang self-documenting ang code.

kotlin
data class GsonParser {
    companion object {
        fun create(): GsonParser = GsonParser()
        fun createPretty(): GsonParser = GsonParser()
    }
}

Constant at enumeration

Object ay maaaring magsilbi bilang container para sa mga constant, na pinapalitan ang static final field sa Java. Sinusuportahan ng object ang pamana, na nagpapahintulot sa paglikha ng hierarchy ng configuration.

Ayon sa Kotlin Standard Library (2026), ang object declaration ay ang pinaka-performant na paraan ng paggawa ng singleton sa Kotlin, na lumalampas sa "double-checked locking" implementations sa bilis at maihahambing sa enum singleton sa Java.

Mga Madalas Itanong

Paano naiiba ang object sa ordinaryong klase?

Object sabay na nagdedeklara ng klase at lumilikha ng nag-iisang instance nito. Ang ordinaryong klase ay maaaring magkaroon ng maraming instance na nilikha sa pamamagitan ng konstruktor.

Kailan na-initialize ang object declaration?

Tamad — sa unang pag-access sa object. Bago iyon, hindi ina-allocate ang memory at hindi na-e-execute ang code sa init block.

Maaari bang magkaroon ng konstruktor ang object?

Hindi, ang object ay hindi maaaring magkaroon ng explicit na konstruktor. Ang inisyalisasyon ay ginagawa sa init block, na tinatawag nang isang beses sa unang pag-access sa object.

Paano naiiba ang companion object sa ordinaryong object?

companion object — ay isang object na idinedeklara sa loob ng isang klase. Ang mga miyembro nito ay accessible sa pamamagitan ng pangalan ng klase nang hindi lumilikha ng instance, na pinapalitan ang static na miyembro ng Java.

Ligtas ba ang object declarations sa multi-thread na kapaligiran?

Oo, ang inisyalisasyon ng object ay ganap na thread-safe dahil sa static initializer ng JVM. Walang karagdagang synchronisasyon ang kinakailangan.

Buod

  • object — deklaratibong singleton na may tamad at thread-safe na inisyalisasyon
  • companion object — static na miyembro sa Kotlin, factory method, constants
  • Object expression — anonymous object on-the-spot na may pagkuha ng variable mula sa closure
  • Pamana — object ay maaaring magmana ng mga klase at interface, kabilang ang maramihang uri
  • Pagganap — inisyalisasyon sa pamamagitan ng static initializer JVM, walang overhead ng double-checked locking
  • Gamit — singleton service, repository, constants, factory, listener adapter
  • Limitasyon — walang explicit na konstruktor, isang instance para sa buong JVM

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din