How do I implement the singleton pattern idiomatically using Kotlin’s object declaration?
In Kotlin, the idiomatic way to implement the Singleton pattern is to use an object declaration. object AppConfig { val appName = "MyApp" fun printConfig() { println("App name: $appName") } } You use it directly by its name: fun main() { AppConfig.printConfig() println(AppConfig.appName) } Kotlin guarantees that an object declaration: has exactly one instance is […]
Artikel oleh Wayan · Sumber: Kode Java ↗
Terjemahan artikel ini belum tersedia. Isi asli ditampilkan.
In Kotlin, the idiomatic way to implement the Singleton pattern is to use an object declaration.
object AppConfig {
val appName = "MyApp"
fun printConfig() {
println("App name: $appName")
}
}
You use it directly by its name:
fun main() {
AppConfig.printConfig()
println(AppConfig.appName)
}
Kotlin guarantees that an object declaration:
- has exactly one instance
- is initialized lazily, when first accessed
- is thread-safe
- can contain properties, functions, initialization blocks, and implement interfaces
Example with initialization:
object DatabaseManager {
init {
println("DatabaseManager initialized")
}
fun connect() {
println("Connecting to database...")
}
}
Usage:
fun main() {
DatabaseManager.connect()
}
If you need a singleton that implements an interface:
interface Logger {
fun log(message: String)
}
object ConsoleLogger : Logger {
override fun log(message: String) {
println("[LOG] $message")
}
}
Usage:
fun main() {
ConsoleLogger.log("Application started")
}
So instead of writing a private constructor and static getInstance() method like in Java, Kotlin’s idiomatic singleton is simply:
object MySingleton {
fun doSomething() {
println("Doing something")
}
}
