Objektausdrücke
Teil des Abschnitts Objektorientierte Programmierung der Kotlin-Journey von Coddy. Lektion 15 von 57.
Ein Objektausdruck erstellt genau dort, wo er benötigt wird, ein einmaliges Objekt einer unbenannten Klasse. Er wird als object : Type { ... } geschrieben und implementiert normalerweise eine Schnittstelle. Eine Schnittstelle listet Methoden auf, ohne zu erklären, wie sie funktionieren; Kapitel 5 behandelt Schnittstellen ausführlich:
interface Greeter {
fun greet(name: String): String
}Innerhalb von main:
val polite = object : Greeter {
override fun greet(name: String) = "Good morning, $name."
}
println(polite.greet("Ada"))Ausgabe:
Good morning, Ada.Eine Objektd deklaration existiert einmal. Ein Objektausdruck wird jedes Mal ausgewertet, wenn sein Code ausgeführt wird, und bei jeder Ausführung wird ein neues Objekt erstellt. Er kann die lokalen Variablen in seiner Umgebung lesen und ändern:
interface Counter {
fun next(): Int
}
fun counterFrom(start: Int): Counter {
var current = start
return object : Counter {
override fun next() = current++
}
}Innerhalb von main:
val a = counterFrom(10)
val b = counterFrom(1)
println("${a.next()} ${a.next()} ${b.next()}")Ausgabe:
10 11 1Eine häufige Verwendung besteht darin, einer Bibliotheksfunktion Verhalten zu übergeben. sortedWith nimmt einen Comparator entgegen, eine Schnittstelle, deren Methode compare(a, b) eine negative Zahl zurückgibt, wenn a zuerst kommt, null bei Gleichstand und andernfalls eine positive Zahl:
Innerhalb von main:
val words = listOf("kiwi", "fig", "banana", "apple")
val byLength = object : Comparator<String> {
override fun compare(a: String, b: String) = a.length - b.length
}
println(words.sortedWith(byLength))Ausgabe:
[fig, kiwi, apple, banana]Ein Objektausdruck ohne Supertyp gruppiert einige Werte zu einem lokalen Objekt; seine Eigenschaften können innerhalb derselben Funktion verwendet werden. Wenn ein Interface eine einzige Methode hat, ist ein Lambda-Ausdruck oft kürzer als ein Objektausdruck. Objektausdrücke eignen sich, wenn mehrere Methoden oder ein bestimmter Zustand beibehalten werden sollen.
val size = object {
val width = 3
val height = 4
}
println(size.width * size.height) // 12
val byLength = Comparator<String> { a, b -> a.length - b.length } // Lambda-FormAufgabe
EinfachDie Schnittstelle Validator verfügt über eine Methode, check(text), die eine Fehlermeldung oder null zurückgibt, wenn der Text die Prüfung besteht. Vervollständige die Funktion rules(minLength), sodass sie in dieser Reihenfolge drei Validatoren zurückgibt, die mit Objektausdrücken erstellt wurden: Der Text muss mindestens minLength Zeichen (too short) enthalten, eine Ziffer (needs a digit) enthalten und darf keine Leerzeichen (no spaces allowed) enthalten.
Der bereitgestellte Code liest die Mindestlänge und anschließend ein Passwort pro Zeile ein. Er gibt ok aus oder jede Fehlermeldung dieses Passworts, verbunden mit ; .
Dein Code gehört in Rules.kt und Validator.kt. Main.kt enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
fun main() {
// Gelieferter Ein-/Ausgabecode: belasse ihn wie er ist
val input = generateSequence(::readLine).toList()
val checks = rules(input[0].toInt())
for (password in input.drop(1)) {
val problems = checks.mapNotNull { it.check(password) }
println(if (problems.isEmpty()) "ok" else problems.joinToString("; "))
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenPrimärkonstruktoreninit-Blöcke und ValidierungSekundärkonstruktorenRückblick – Bibliotheksausweis4Vererbung
Offene Klassen und UnterklassenÜberschreiben von Membernsuper und KonstruktorenAbstrakte KlassenRückblick – Mitarbeiterverzeichnis2Eigenschaften und Kapselung
Benutzerdefinierte ZugriffsmethodenSichtbarkeitsmodifikatorenPrivate Setterlazy und lateinitWiederholung – Bankkonto5Schnittstellen
Schnittstellen deklarierenStandardmethodenMehrere SchnittstellenSchnittstellen als TypenRückblick – Zahlungsmethoden8Generics
Generische FunktionenGenerische KlassenTypbeschränkungenVarianz mit in und outRückblick – Prioritätswarteschlange11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihen3Objekte und Companion-Objekte
ObjektdeklarationenCompanion-ObjekteKonstanten mit constObjektausdrückeRückblick – FahrkartenschalterÜbe selbstständig: Kotlin-Playground