Wyrażenia obiektowe
Część sekcji Programowanie obiektowe ścieżki Kotlin w Coddy. Lekcja 15 z 57.
Wyrażenie obiektu tworzy jednorazowy obiekt nienazwanej klasy w miejscu, w którym jest potrzebny. Zapisuje się je jako object : Type { ... } i zwykle implementuje interfejs. Interfejs wymienia metody, nie określając, jak działają; rozdział 5 szczegółowo omawia interfejsy:
interface Greeter {
fun greet(name: String): String
}Wewnątrz main:
val polite = object : Greeter {
override fun greet(name: String) = "Good morning, $name."
}
println(polite.greet("Ada"))Wynik:
Good morning, Ada.Deklaracja obiektu istnieje tylko raz. Wyrażenie obiektu jest obliczane za każdym razem, gdy wykonywany jest jego kod, a każde wykonanie tworzy nowy obiekt. Może odczytywać i zmieniać otaczające je zmienne lokalne:
interface Counter {
fun next(): Int
}
fun counterFrom(start: Int): Counter {
var current = start
return object : Counter {
override fun next() = current++
}
}Wewnątrz main:
val a = counterFrom(10)
val b = counterFrom(1)
println("${a.next()} ${a.next()} ${b.next()}")Wynik:
10 11 1Często przekazuje się zachowanie funkcji bibliotecznej. sortedWith przyjmuje Comparator, czyli interfejs, którego metoda compare(a, b) zwraca liczbę ujemną, gdy a występuje przed b, zero w przypadku remisu, a w przeciwnym razie liczbę dodatnią:
Wewnątrz 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))Wynik:
[fig, kiwi, apple, banana]Wyrażenie obiektowe bez nadtypu grupuje kilka wartości w lokalnym obiekcie; jego właściwości można wykorzystywać w obrębie tej samej funkcji. Gdy interfejs ma jedną metodę, lambda jest często krótsza niż wyrażenie obiektowe. Wyrażenia obiektowe sprawdzają się, gdy jest kilka metod lub trzeba zachować jakiś stan.
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 } // postać lambdyWyzwanie
ŁatwyInterfejs Validator ma jedną metodę, check(text), która zwraca komunikat o błędzie lub null, gdy tekst spełnia wymagania. Uzupełnij funkcję rules(minLength), tak aby zwracała trzy walidatory utworzone za pomocą wyrażeń obiektowych, w następującej kolejności: tekst musi mieć co najmniej minLength znaków (too short), zawierać cyfrę (needs a digit) i nie zawierać spacji (no spaces allowed).
Dostarczony kod odczytuje minimalną długość, a następnie jedno hasło w każdym wierszu. Wypisuje ok albo wszystkie komunikaty o błędach dotyczące danego hasła, połączone za pomocą ; .
Twój kod umieść w plikach Rules.kt i Validator.kt. Main.kt zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
fun main() {
// Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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("; "))
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasKonstruktory główneBloki init i walidacjaKonstruktory dodatkowePodsumowanie — karta biblioteczna4Dziedziczenie
Klasy otwarte i podklasyNadpisywanie składowychsuper i konstruktoryKlasy abstrakcyjnePodsumowanie – katalog pracowników7Klasy specjalne
Klasy danychKlasy wyliczenioweHierarchie zapieczętowaneequals, hashCode, toStringPodsumowanie — śledzenie zamówień10Wzorce projektowe, część 2
Delegowanie za pomocą byWzorzec dekoratoraWzorzec budowniczegoWzorzec stanu2Właściwości i hermetyzacja
Własne akcesoryModyfikatory widocznościPrywatne setterylazy i lateinitPowtórka – konto bankowe5Interfejsy
Deklarowanie interfejsówMetody domyślneWiele interfejsówInterfejsy jako typyPowtórzenie – metody płatności8Typy generyczne
Funkcje generyczneKlasy generyczneOgraniczenia typówKowariancja i kontrawariancja: in i outPodsumowanie — kolejka priorytetowa11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książek3Obiekty i obiekty towarzyszące
Deklaracje obiektówObiekty towarzysząceStałe z constWyrażenia obiektowePowtórzenie — kasa biletowaPoćwicz samodzielnie: Edytor online Kotlin