object w Kotlin — to deklaratywny sposób tworzenia obiektu singleton z leniwą inicjalizacją i bezpieczeństwem wątkowym domyślnie. Słowo kluczowe object zastępuje całą klasę z pojedynczym egzemplarzem i jest używane do deklarowania singleton, companion object, anonimowych obiektów i statycznych narzędzi. Według JetBrains Kotlin Documentation (2026), object declaration to najprostszy i najbezpieczniejszy sposób implementacji singletona w świecie JVM.
Najważniejsze
object w Kotlin — to specjalna forma deklaracji, która jednocześnie definiuje klasę i tworzy jej jedyny egzemplarz (singleton). To hybryda class declaration i instance creation w jednej konstrukcji.
W Java do utworzenia singletona trzeba napisać prywatny konstruktor, statyczne pole, metodę getInstance i obsłużyć bezpieczeństwo wątkowe. Kotlin object robi to jedną linią kodu: object MySingleton { }. Kompilator samodzielnie generuje bezpieczną wątkowo leniwą inicjalizację, używając mechanizmu static initializer w kodzie bajtowym JVM.
Według Kotlin Language Specification (2026), object declaration kompiluje się do finalnej klasy z prywatnym konstruktorem i statycznym polem INSTANCE, inicjalizowanym w statycznym bloku. Gwarantuje to atomowość inicjalizacji na poziomie JVM.
Object declaration (obiekt singleton) deklaruje się za pomocą słowa kluczowego object, po którym następuje nazwa. Ciało obiektu może zawierać właściwości, metody, bloki init i dziedziczyć po innych klasach lub interfejsach.
object DatabaseManager {
private val connection: String = "jdbc:postgresql://localhost:5432/app"
fun query(sql: String): List<Map<String, Any>> {
// wykonywanie zapytania
return emptyList()
}
}
// Użycie
DatabaseManager.query("SELECT * FROM users")
Inicjalizacja DatabaseManager następuje w momencie pierwszego dostępu — leniwie i bezpiecznie wątkowo. Żaden dodatkowy kod do synchronizacji nie jest wymagany.
Object może dziedziczyć zwykłe klasy i interfejsy. Pozwala to użyć object jako implementacji abstrakcyjnej klasy lub interfejsu z pojedynczym egzemplarzem.
interface Logger {
fun log(message: String)
}
object ConsoleLogger : Logger {
override fun log(message: String) {
println("[LOG] $message")
}
}
companion object — to specjalny object zadeklarowany wewnątrz klasy ze słowem kluczowym companion. Zastępuje statyczne człony w Kotlin, ponieważ w języku nie ma słowa kluczowego static.
class ApiClient {
companion object {
private const val BASE_URL = "https://api.example.com"
fun create(): ApiClient {
return ApiClient()
}
}
}
// Wywołanie bez tworzenia instancji ApiClient
val client = ApiClient.create()
Companion object może mieć nazwę (domyślnie Companion), implementować interfejsy i być rozszerzany przez extension functions. W przeciwieństwie do statycznych metod w Java, companion object to pełnoprawny obiekt, który może być przekazany jako argument lub zapisany do zmiennej.
Według Kotlin Best Practices (2026), companion object jest używany do metod fabrycznych, stałych i statycznych narzędzi związanych z klasą. Zaleca się unikanie nadmiernego używania companion object — dla niezwiązanych narzędzi lepiej stosować funkcje najwyższego poziomu.
Dla zgodności z Java companion object można adnotować metody @JvmStatic. To generuje prawdziwą statyczną metodę w kodzie bajtowym JVM, dostępną z kodu Java bez składni Companion.
Object expression — to anonimowy obiekt tworzony na miejscu do nadpisywania metod klasy lub interfejsu bez deklarowania osobnej nazwanej klasy.
val handler = object : Runnable {
override fun run() {
println("Zadanie wykonane")
}
}
thread(handler)
Object expressions różnią się od deklaracji object tym, że tworzą nowy egzemplarz przy każdym wykonaniu. Nie są singletonami i nie mają nazwy. Anonimowe obiekty mogą przechwytywać zmienne z domknięcia, podobnie jak lambdy.
W przeciwieństwie do Java, gdzie anonimowe klasy mogą dziedziczyć tylko jeden typ, Kotlin object expression może dziedziczyć wiele typów jednocześnie.
interface Clickable {
fun click()
}
abstract class View {
abstract fun render()
}
val button = object : View(), Clickable {
override fun render() = println("Renderowanie przycisku")
override fun click() = println("Kliknięto przycisk")
}
Object — jedna z najbardziej wszechstronnych konstrukcji Kotlin, używana w wielu scenariuszach.
W projektach Android object jest często używany do deklarowania Repository, gdzie nie potrzeba wielu egzemplarzy. Pojedynczy egzemplarz gwarantuje spójność danych.
object UserRepository {
fun getUser(id: Int): User? {
// pobieranie użytkownika
return null
}
}
Companion object z metodami fabrycznymi — alternatywa dla wielu konstruktorów. Nazwane metody fabryczne czynią kod samodokumentującym się.
data class GsonParser {
companion object {
fun create(): GsonParser = GsonParser()
fun createPretty(): GsonParser = GsonParser()
}
}
Object może służyć jako kontener dla stałych, zastępując statyczne pola final w Java. Przy tym object obsługuje dziedziczenie, co pozwala tworzyć hierarchie konfiguracji.
Według Kotlin Standard Library (2026), object declaration jest najbardziej wydajnym sposobem tworzenia singletona w Kotlin, przewyższając szybkością implementacje „double-checked locking” i porównywalny z enum singleton w Java.
Często zadawane pytania
Object jednocześnie deklaruje klasę i tworzy jej jedyny egzemplarz. Zwykła klasa może mieć wiele egzemplarzy tworzonych przez konstruktor.
Leniwie — przy pierwszym dostępie do obiektu. Do tego czasu pamięć nie jest alokowana, a kod w bloku init nie jest wykonywany.
Nie, object nie może mieć jawnego konstruktora. Inicjalizacja odbywa się w bloku init, który jest wywoływany raz przy pierwszym dostępie do obiektu.
companion object — to object zadeklarowany wewnątrz klasy. Jego człony są dostępne przez nazwę klasy bez tworzenia egzemplarza, co zastępuje statyczne człony Java.
Tak, inicjalizacja object jest w pełni bezpieczna wątkowo dzięki statycznemu inicjalizatorowi JVM. Żadna dodatkowa synchronizacja nie jest wymagana.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również