object in Kotlin: Syntax und praktische Anwendung von Singleton-Objekten

Autor: IT Sectr Veröffentlicht: 2026-06-21 Lesezeit: 9 Min.

object in Kotlin ist eine deklarative Methode zum Erstellen eines Singleton-Objekts mit Lazy-Initialisierung und standardmäßiger Thread-Sicherheit. Das Schlüsselwort object ersetzt eine ganze Klasse durch eine einzelne Instanz und wird zum Deklarieren von Singletons, companion objects, anonymen Objekten und statischen Hilfsprogrammen verwendet. Laut JetBrains Kotlin Documentation (2026) ist die object declaration der einfachste und sicherste Weg, ein Singleton in der JVM-Welt zu implementieren.

Wichtige Punkte

  • object — Schlüsselwort zum Deklarieren einer Singleton-Klasse mit einer einzigen Instanz
  • Lazy Initialisierung — object wird beim ersten Zugriff erstellt, nicht beim Laden der Klasse
  • Companion object — Analogon zu statischen Mitgliedern in Kotlin (kein static-Schlüsselwort)
  • Object expression — anonymes Objekt zum Überschreiben von Methoden spontan
  • Thread Sicherheit — die Initialisierung von object ist garantiert thread-safe

Was ist object in Kotlin?

object in Kotlin ist eine spezielle Deklarationsform, die gleichzeitig eine Klasse definiert und ihre einzige Instanz (Singleton) erstellt. Es ist eine Mischung aus Klassendeklaration und Instanzerstellung in einem Konstrukt.

In Java erfordert die Erstellung eines Singletons einen privaten Konstruktor, ein statisches Feld, eine getInstance-Methode und Thread-Sicherheitsbehandlung. Kotlin object erledigt dies mit einer einzigen Codezeile: object MySingleton { }. Der Compiler generiert automatisch eine thread-sichere Lazy-Initialisierung unter Verwendung des static-initializer-Mechanismus im JVM-Bytecode.

Laut Kotlin Language Specification (2026) wird die object declaration in eine finale Klasse mit einem privaten Konstruktor und einem statischen INSTANCE-Feld kompiliert, das in einem statischen Block initialisiert wird. Dies garantiert die Atomizität der Initialisierung auf JVM-Ebene.

Singleton-Objekte (object declaration)

Object declaration (Singleton-Objekt) wird mit dem Schlüsselwort object gefolgt von einem Namen deklariert. Der Objektkörper kann Eigenschaften, Methoden, init-Blöcke enthalten und andere Klassen oder Schnittstellen erben.

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

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

Die Initialisierung von DatabaseManager erfolgt beim ersten Zugriff — lazy und thread-sicher. Es ist kein zusätzlicher Synchronisationscode erforderlich.

Vererbung für object

Object kann reguläre Klassen und Schnittstellen erben. Dies erlaubt die Verwendung von object als Implementierung einer abstrakten Klasse oder Schnittstelle mit einer einzigen Instanz.

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

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

Companion object

companion object ist ein spezielles object, das innerhalb einer Klasse mit dem Schlüsselwort companion deklariert wird. Es ersetzt statische Mitglieder in Kotlin, da die Sprache kein static-Schlüsselwort hat.

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

// Aufruf ohne Erstellen einer ApiClient-Instanz
val client = ApiClient.create()

Companion object kann einen Namen haben (Standard ist Companion), Schnittstellen implementieren und über extension functions erweitert werden. Im Gegensatz zu statischen Methoden in Java ist ein companion object ein vollwertiges Objekt, das als Argument übergeben oder in einer Variable gespeichert werden kann.

Laut Kotlin Best Practices (2026) wird companion object für Factory-Methoden, Konstanten und statische Hilfsprogramme verwendet, die mit der Klasse verbunden sind. Es wird empfohlen, eine übermäßige Verwendung von companion object zu vermeiden — für nicht verwandte Hilfsprogramme sind Top-Level-Funktionen vorzuziehen.

@JvmStatic Annotation

Für die Java-Kompatibilität können Methoden des companion object mit @JvmStatic annotiert werden. Dies generiert eine echte statische Methode im JVM-Bytecode, die aus Java-Code ohne die Companion-Syntax zugänglich ist.

Object expressions (anonyme Objekte)

Object expression ist ein anonymes Objekt, das spontan erstellt wird, um Methoden einer Klasse oder Schnittstelle zu überschreiben, ohne eine separate benannte Klasse zu deklarieren.

kotlin
val handler = object : Runnable {
    override fun run() {
        println("Aufgabe ausgeführt")
    }
}

thread(handler)

Object expressions unterscheiden sich von object-Deklarationen dadurch, dass sie bei jeder Ausführung eine neue Instanz erstellen. Sie sind keine Singletons und haben keinen Namen. Anonyme Objekte können Variablen aus ihrem Abschluss erfassen, genau wie Lambdas.

Im Gegensatz zu Java, wo anonyme Klassen nur einen Typ erben können, kann die Kotlin object expression mehrere Typen gleichzeitig erben.

kotlin
interface Clickable {
    fun click()
}

abstract class View {
    abstract fun render()
}

val button = object : View(), Clickable {
    override fun render() = println("Button rendern")
    override fun click() = println("Button geklickt")
}

Praktische Anwendungsszenarien

Object ist eines der vielseitigsten Konstrukte in Kotlin und wird in vielen Szenarien verwendet.

Repository-Singletons

In Android-Projekten wird object häufig zum Deklarieren eines Repository verwendet, wo mehrere Instanzen nicht benötigt werden. Eine einzelne Instanz gewährleistet Datenkonsistenz.

kotlin
object UserRepository {
    fun getUser(id: Int): User? {
        // Benutzer abrufen
        return null
    }
}

Factory-Methoden über companion object

Companion object mit Factory-Methoden ist eine Alternative zu mehreren Konstruktoren. Benannte Factory-Methoden machen den Code selbstdokumentierend.

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

Konstanten und Aufzählungen

Object kann als Container für Konstanten dienen und ersetzt statische final-Felder in Java. Object unterstützt Vererbung, was die Erstellung von Konfigurationshierarchien ermöglicht.

Laut Kotlin Standardbibliothek (2026) ist die object declaration die leistungsfähigste Methode zum Erstellen eines Singletons in Kotlin, die Double-checked-locking-Implementierungen übertrifft und mit dem enum-Singleton in Java vergleichbar ist.

Häufig gestellte Fragen

Wie unterscheidet sich object von einer regulären Klasse?

Object deklariert gleichzeitig eine Klasse und erstellt ihre einzige Instanz. Eine reguläre Klasse kann mehrere Instanzen haben, die über einen Konstruktor erstellt werden.

Wann wird eine object declaration initialisiert?

Lazy — beim ersten Zugriff auf das Objekt. Bis dahin wird kein Speicher zugewiesen und der Code im init-Block wird nicht ausgeführt.

Kann ein object einen Konstruktor haben?

Nein, object kann keinen expliziten Konstruktor haben. Die Initialisierung erfolgt im init-Block, der einmal beim ersten Zugriff auf das Objekt aufgerufen wird.

Wie unterscheidet sich companion object von einem normalen object?

companion object ist ein object, das innerhalb einer Klasse deklariert wird. Seine Mitglieder sind über den Klassennamen zugänglich, ohne eine Instanz zu erstellen, und ersetzen die statischen Mitglieder von Java.

Sind object declarations in einer Multithread-Umgebung sicher?

Ja, die Initialisierung von object ist dank des statischen Initialisierers der JVM vollständig thread-sicher. Es ist keine zusätzliche Synchronisation erforderlich.

Zusammenfassung

  • object — deklaratives Singleton mit Lazy- und Thread-sicherer Initialisierung
  • companion object — statische Mitglieder in Kotlin, Factory-Methoden, Konstanten
  • Object expression — anonyme Objekte spontan mit Variablen erfassung aus dem Abschluss
  • Vererbung — object kann Klassen und Schnittstellen erben, einschließlich mehrerer Typen
  • Leistung — Initialisierung über JVM static initializer, ohne Double-checked-locking-Overhead
  • Verwendung — Singleton-Dienste, Repository, Konstanten, Fabriken, Listener-Adapter
  • Einschränkungen — kein expliziter Konstruktor, eine Instanz pro JVM

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch