Kotlin Academy · Lekcja

Właściwości rozszerzające i rozszerzenia obliczane

Dodawaj właściwości obliczane do istniejących klas bez tworzenia podklas.

Lekcja 2 z 413 kroki

Właściwości rozszerzające i rozszerzenia obliczane to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Właściwości rozszerzające

Właściwości rozszerzające dodają obliczane właściwości do istniejących typów bez tworzenia podklas. Nie mają pola zapasowego.

Tylko do odczytu: właściwość rozszerzająca

Aby utworzyć obliczaną właściwość rozszerzającą, należy zdefiniować getter.
val String.wordCount: Int
    get() = trim().split(Regex("\\s+")).size
println("hello world kotlin".wordCount)  // 3

Zmienna właściwość rozszerzająca

Dla właściwości rozszerzającej umożliwiającej odczyt i zapis należy zdefiniować zarówno getter, jak i setter.
var MutableList<Int>.first: Int
    get() = this[0]
    set(value) { this[0] = value }
val list = mutableListOf(1, 2, 3)
list.first = 10
println(list)  // [10, 2, 3]

Brak pola zapasowego

Właściwości rozszerzające nie mogą mieć pól zapasowych. Zawsze są obliczane na podstawie istniejącego stanu.
// ERROR: extension property cannot have backing field
// var String.cache: String = ""  // NOT allowed!

// OK: computed only:
val String.isPalindrome: Boolean
    get() = this == this.reversed()

Właściwości rozszerzające kolekcji

Do typów kolekcji można dodawać wygodne właściwości.
val <T> List<T>.secondOrNull: T?
    get() = if (size >= 2) this[1] else null
val <T> List<T>.isNotNullOrEmpty: Boolean
    get() = isNotEmpty()
println(listOf(1, 2, 3).secondOrNull)  // 2

Właściwości rozszerzające typu Boolean

Można tworzyć czytelne właściwości Boolean do sprawdzania typów.
val Any.isString: Boolean get() = this is String
val String.hasDigits: Boolean get() = any { it.isDigit() }
val Int.isPositive: Boolean get() = this > 0
println(42.isPositive)        // true
println("abc123".hasDigits)   // true

Właściwości rozszerzające a funkcje rozszerzające

Właściwości należy używać, gdy obliczenie jest proste i opisuje cechę obiektu. Funkcji należy używać, gdy przyjmuje parametry lub wywołuje efekty uboczne.
// Property: stateless, simple characteristic
val String.isEmail: Boolean get() = '@' in this
// Function: has parameters
fun String.padCenter(width: Int) = padStart((length + width) / 2)

Rozszerzanie companion object

Do companion object można dodawać właściwości rozszerzające.
data class Color(val r: Int, val g: Int, val b: Int) {
    companion object
}
val Color.Companion.RED get() = Color(255, 0, 0)
val Color.Companion.WHITE get() = Color(255, 255, 255)
println(Color.RED)  // Color(r=255, g=0, b=0)

Kontekstowe właściwości rozszerzające

Właściwości rozszerzające zdefiniowane wewnątrz klasy mają zastosowanie tylko wewnątrz zakresu tej klasy.
class Formatter {
    val Int.formatted: String
        get() = "%,d".format(this)
    fun format(n: Int) = n.formatted
}
println(Formatter().format(1000000))  // 1,000,000

Używanie rozszerzeń w DSL-ach

Właściwości rozszerzające są podstawą projektowania DSL-i w Kotlinie.
val Int.dp: Float get() = this * 2.5f
val Float.sp: Float get() = this * 1.0f
// In DSL context:
view.setPadding(16.dp.toInt())

Generyczne właściwości rozszerzające

Właściwości rozszerzające mogą mieć parametry typów.
val <T> List<T>.head: T?
    get() = firstOrNull()
val <T> List<T>.tail: List<T>
    get() = drop(1)
println(listOf(1,2,3).head)  // 1
println(listOf(1,2,3).tail)  // [2, 3]

Szybkie sprawdzenie

Czy właściwości rozszerzające mogą mieć w Kotlinie pola zapasowe?

Podsumowanie

Właściwości rozszerzające dodają obliczane cechy do typów bez pól zapasowych. Należy ich używać do prostych, bezstanowych obliczeń. Zmienne właściwości rozszerzające mogą mieć settery. Są świetnym rozwiązaniem dla DSL-i i płynnych interfejsów API. Dalej: rozszerzenia o ograniczonym zakresie i rozszerzenia companion!
Bezpłatny start

Ucz się Kotlin dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
51
Lekcje
203

Często zadawane pytania

Czy lekcja „Właściwości rozszerzające i rozszerzenia obliczane” jest bezpłatna?

Tak — pełny tekst „Właściwości rozszerzające i rozszerzenia obliczane” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Właściwości rozszerzające i rozszerzenia obliczane”?

Dodawaj właściwości obliczane do istniejących klas bez tworzenia podklas. Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?

Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Właściwości rozszerzające i rozszerzenia obliczane”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?

Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Funkcje rozszerzające: składnia i reguły wyszukiwania
  2. Właściwości rozszerzające i rozszerzenia obliczane
  3. Rozszerzenia o ograniczonym zakresie i rozszerzenia companion
  4. Praktyczne rozszerzenia: pomocnicze funkcje Context, View i String
← Powrót do Kotlin Academy