Anonyme Objekte und Object Expressions
Verwenden Sie Object Expressions, um einmalige Implementierungen von Interfaces zu erstellen.
Anonyme Objekte und Object Expressions ist eine kostenlose Kotlin Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Kotlin Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.
Objektausdrücke
Ein Objektausdruck erzeugt eine anonyme, einmalige Instanz einer Klasse oder eines Interfaces – das Kotlin-Gegenstück zu anonymen inneren Klassen in Java, aber leistungsfähiger.
Ein Interface anonym implementieren
Verwenden Sie object : Interface { ... }, um eine Inline-Implementierung zu erstellen.
interface ClickListener {
fun onClick(): String
}
fun main() {
val listener = object : ClickListener {
override fun onClick() = "clicked!"
}
println(listener.onClick())
}Anonyme Klasse mit Zustand
Anonyme Objekte können Zustand speichern und mehrere Methoden besitzen.
fun main() {
val counter = object {
var count = 0
fun inc() { count++ }
fun show() = println("count = $count")
}
counter.inc(); counter.inc(); counter.inc()
counter.show()
}Typ anonymer Objekte
Der Typ eines anonymen Objekts wird abgeleitet. Wenn Sie es auf Funktionsebene deklarieren, behalten Sie Zugriff auf seine benutzerdefinierten Mitglieder.
fun main() {
val pair = object {
val left = "L"
val right = "R"
}
println("${pair.left} and ${pair.right}")
}Sichtbarkeit anonymer Typen
Wenn ein anonymes Objekt aus einer Funktion mit abgeleitetem Rückgabetyp zurückgegeben wird, sehen Aufrufer nur den Supertyp – auf die zusätzlichen Mitglieder des anonymen Objekts kann von außen nicht zugegriffen werden.
fun makeListener() = object {
fun greet() = "hello"
}
fun main() {
val l = makeListener()
println(l.greet()) // OK — same compilation unit
}Mehrere Interfaces
Ein anonymes Objekt kann in einem Ausdruck mehrere Interfaces implementieren.
interface Closeable { fun close() }
interface Flushable { fun flush() }
fun main() {
val resource = object : Closeable, Flushable {
override fun close() = println("closed")
override fun flush() = println("flushed")
}
resource.flush()
resource.close()
}Eine Klasse erweitern
Anonyme Objekte können eine offene Klasse erweitern und dabei Mitglieder überschreiben.
open class Animal(val name: String) {
open fun speak() = "$name makes a sound"
}
fun main() {
val pet = object : Animal("Rex") {
override fun speak() = "$name barks!"
}
println(pet.speak())
}Variablen aus dem umgebenden Bereich erfassen
Anonyme Objekte können auf Variablen im umgebenden Gültigkeitsbereich zugreifen und sie erfassen (sie lesen und ändern) – anders als in Java, wo final erforderlich ist.
fun main() {
var log = mutableListOf<String>()
val recorder = object {
fun record(s: String) { log.add(s) }
}
recorder.record("event 1")
recorder.record("event 2")
println(log)
}Wann anonyme Objekte verwendet werden
Verwenden Sie anonyme Objekte für einmalige Implementierungen, die keine eigene Klasse verdienen – typischerweise für Callbacks, Listener oder Vergleicher.
fun main() {
val nums = listOf(3, 1, 4, 1, 5, 9, 2, 6)
val sorted = nums.sortedWith(object : Comparator<Int> {
override fun compare(a: Int, b: Int) = b - a // descending
})
println(sorted)
}Wenn möglich Lambdas bevorzugen
Wenn das Interface eine einzige abstrakte Methode (SAM) besitzt, ist ein Lambda-Ausdruck übersichtlicher als ein Objektausdruck.
fun main() {
val nums = listOf(3, 1, 4, 1, 5, 9)
// Old way:
val sorted1 = nums.sortedWith(object : Comparator<Int> {
override fun compare(a: Int, b: Int) = b - a
})
// New way — SAM conversion:
val sorted2 = nums.sortedWith(Comparator { a, b -> b - a })
println("$sorted1 / $sorted2")
}Anonymes vs. deklariertes Objekt
Verwenden Sie object Name für ein benanntes Singleton. Verwenden Sie object : Type in einem Ausdruck für eine einmalige anonyme Instanz.
// Named singleton (one instance, accessed globally)
object GlobalLogger { fun log(m: String) = println("[L] $m") }
// Anonymous (created at expression evaluation)
fun main() {
val local = object { fun hi() = "hi" }
GlobalLogger.log("hello")
println(local.hi())
}Kurztest
Welche Syntax erstellt inline eine anonyme Instanz, die ein Interface implementiert?
Zusammenfassung
Objektausdrücke erstellen inline einmalige anonyme Instanzen. Sie können Interfaces implementieren, Klassen erweitern, Zustand speichern und auf Variablen im umgebenden Gültigkeitsbereich zugreifen. Bevorzugen Sie Lambdas für Interfaces mit einer einzigen Methode; verwenden Sie Objektausdrücke, wenn Sie mehrere Methoden oder Zustand benötigen.
Häufig gestellte Fragen
Ist die Lektion „Anonyme Objekte und Object Expressions“ kostenlos?
Ja — der vollständige Text von „Anonyme Objekte und Object Expressions“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Kotlin Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Anonyme Objekte und Object Expressions“?
Verwenden Sie Object Expressions, um einmalige Implementierungen von Interfaces zu erstellen. Du übst Kotlin Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Kotlin Academy zu starten?
Keine Vorkenntnisse erforderlich. Kotlin Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Anonyme Objekte und Object Expressions“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Kotlin Academy-Lektion Code schreiben und ausführen?
Ja. Jede Kotlin Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- object-Deklaration: Kotlin-Singletons
- companion object: Statische Member in Kotlin
- Anonyme Objekte und Object Expressions
- Factory-Methoden mit companion object