object v Kotlinu: co to je, syntaxe a použití singleton objektů

Autor: IT Sectr Publikováno: 2026-06-21 Doba čtení: 9 min

object v Kotlinu — je deklarativní způsob vytvoření singleton objektu s línou inicializací a vláknovou bezpečností ve výchozím nastavení. Klíčové slovo object nahrazuje celou třídu s jedinou instancí a používá se k deklaraci singleton, companion object, anonymních objektů a statických utilit. Podle JetBrains Kotlin Documentation (2026) je object declaration nejjednodušší a nejbezpečnější způsob implementace singletonu ve světě JVM.

Hlavní body

  • object — klíčové slovo pro deklaraci singleton třídy s jedinou instancí
  • Líná inicializace — object se vytváří při prvním přístupu, ne při načítání třídy
  • Companion object — analogie statických členů v Kotlinu (není klíčové slovo static)
  • Object expression — anonymní objekt pro přepisování metod za běhu
  • Vláknová bezpečnost — inicializace object je zaručeně thread-safe

Co je object v Kotlinu?

object v Kotlinu — je speciální forma deklarace, která současně definuje třídu a vytváří její jedinou instanci (singleton). Je to hybrid class declaration a instance creation v jedné konstrukci.

V Javě je pro vytvoření singletonu třeba napsat soukromý konstruktor, statické pole, metodu getInstance a zpracovat vláknovou bezpečnost. Kotlin object to dělá jedním řádkem kódu: object MySingleton { }. Kompilátor automaticky generuje vláknově bezpečnou línou inicializaci pomocí mechanismu static initializer v JVM bytekódu.

Podle Kotlin Language Specification (2026) se object declaration zkompiluje do finální třídy se soukromým konstruktorem a statickým polem INSTANCE, inicializovaným ve statickém bloku. To zaručuje atomicitu inicializace na úrovni JVM.

Singleton objekty (object declaration)

Object declaration (singleton objekt) se deklaruje pomocí klíčového slova object, za kterým následuje název. Tělo objektu může obsahovat vlastnosti, metody, init bloky a dědit z jiných tříd nebo rozhraní.

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

// Použití
DatabaseManager.query("SELECT * FROM users")

Inicializace DatabaseManageru nastává v okamžiku prvního přístupu — líně a vláknově bezpečně. Není vyžadován žádný další kód pro synchronizaci.

Dědění pro object

Object může dědit z běžných tříd a rozhraní. To umožňuje použít object jako implementaci abstraktní třídy nebo rozhraní s jedinou instancí.

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

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

Companion object

companion object — je speciální object deklarovaný uvnitř třídy s klíčovým slovem companion. Nahrazuje statické členy v Kotlinu, protože v jazyce není klíčové slovo static.

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

// Volání bez vytvoření instance ApiClient
val client = ApiClient.create()

Companion object může mít jméno (výchozí Companion), implementovat rozhraní a být rozšiřitelný pomocí extension functions. Na rozdíl od statických metod v Javě je companion object plnohodnotný objekt, který lze předat jako argument nebo uložit do proměnné.

Podle Kotlin Best Practices (2026) se companion object používá pro tovární metody, konstanty a statické utility spojené s třídou. Doporučuje se vyhnout nadměrnému používání companion object — pro nesouvisející utility je lepší používat funkce nejvyšší úrovně.

Anotace @JvmStatic

Pro kompatibilitu s Javou lze metody companion object anotovat @JvmStatic. To generuje skutečnou statickou metodu v JVM bytekódu, přístupnou z Java kódu bez syntaxe Companion.

Object expressions (anonymní objekty)

Object expression — je anonymní objekt vytvořený na místě pro přepsání metod třídy nebo rozhraní bez deklarace samostatné pojmenované třídy.

kotlin
val handler = object : Runnable {
    override fun run() {
        println("Úloha provedena")
    }
}

thread(handler)

Object expressions se liší od deklarací object tím, že při každém provedení vytvářejí novou instanci. Nejsou to singly a nemají jméno. Anonymní objekty mohou zachytávat proměnné z uzávěru, stejně jako lambdy.

Na rozdíl od Javy, kde anonymní třídy mohou dědit pouze jeden typ, Kotlin object expression může dědit několik typů současně.

kotlin
interface Clickable {
    fun click()
}

abstract class View {
    abstract fun render()
}

val button = object : View(), Clickable {
    override fun render() = println("Vykreslení tlačítka")
    override fun click() = println("Tlačítko kliknuto")
}

Praktické scénáře použití

Object — jedna z nejvšestrannějších konstrukcí Kotlinu, používaná v mnoha scénářích.

Singleton repozitáře

V Android projektech se object často používá k deklaraci Repository, kde není potřeba více instancí. Jediná instance zaručuje konzistenci dat.

kotlin
object UserRepository {
    fun getUser(id: Int): User? {
        // získání uživatele
        return null
    }
}

Tovární metody přes companion object

Companion object s továrními metodami — alternativa k více konstruktorům. Pojmenované tovární metody činí kód samodokumentujícím.

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

Konstanty a výčty

Object může sloužit jako kontejner pro konstanty, nahrazující statická final pole v Javě. Object podporuje dědičnost, což umožňuje vytváření hierarchií konfigurací.

Podle Kotlin Standard Library (2026) je object declaration nejvýkonnější způsob vytvoření singletonu v Kotlinu, překonávající v rychlosti implementace „double-checked locking" a srovnatelný s enum singleton v Javě.

Často kladené otázky

Čím se object liší od běžné třídy?

Object současně deklaruje třídu a vytváří její jedinou instanci. Běžná třída může mít mnoho instancí vytvořených pomocí konstruktoru.

Kdy se inicializuje object declaration?

Líně — při prvním přístupu k objektu. Do té doby není paměť alokována a kód v init bloku se nespouští.

Může object mít konstruktor?

Ne, object nemůže mít explicitní konstruktor. Inicializace probíhá v init bloku, který je volán jednou při prvním přístupu k objektu.

Čím se companion object liší od běžného objectu?

companion object — je object deklarovaný uvnitř třídy. Jeho členy jsou přístupné přes název třídy bez vytvoření instance, což nahrazuje statické členy Javy.

Jsou object declarations bezpečné ve vícevláknovém prostředí?

Ano, inicializace object je plně thread-safe díky statickému inicializátoru JVM. Není vyžadována žádná další synchronizace.

Shrnutí

  • object — deklarativní singleton s línou a vláknově bezpečnou inicializací
  • companion object — statické členy v Kotlinu, tovární metody, konstanty
  • Object expression — anonymní objekty na místě se zachycením proměnných z uzávěru
  • Dědičnost — object může dědit třídy a rozhraní, včetně několika typů
  • Výkon — inicializace přes static initializer JVM, bez režie double-checked locking
  • Použití — singleton služby, repozitáře, konstanty, továrny, adaptéry listenerů
  • Omezení — žádný explicitní konstruktor, jedna instance pro celou JVM

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také