0Pricing
Kotlin Academy · Lekcja

Własne gettery i settery z field

Pisz właściwości obliczane i własne settery z użyciem słowa kluczowego backing field.

Własne gettery i settery z field to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 3 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 to nie tylko pola

Każda właściwość Kotlina ma automatycznie wygenerowany getter, a w przypadku var także setter. Można je zastąpić własnymi implementacjami, aby dodać logikę — walidację, rejestrowanie lub obliczenia.

Własny getter

Zastąp get(), aby obliczać wartość przy każdym jej odczycie.

class Circle(val radius: Double) {
    val area: Double
        get() = Math.PI * radius * radius
}
fun main() {
    val c = Circle(3.0)
    println(c.area) // ~28.27
}

Właściwości obliczane

Właściwości obliczane nie mają pola zapasowego — ich wartość jest obliczana przy każdym dostępie.

class Rectangle(val w: Int, val h: Int) {
    val area get() = w * h
    val perimeter get() = 2 * (w + h)
}
fun main() {
    val r = Rectangle(3, 4)
    println("${r.area}, ${r.perimeter}") // 12, 14
}

Własny setter z field

Wewnątrz własnego settera field odnosi się do pola zapasowego — rzeczywistego miejsca przechowywania wartości.

class Temperature {
    var celsius: Double = 0.0
        set(value) {
            require(value >= -273.15) { "below absolute zero" }
            field = value
        }
}
fun main() {
    val t = Temperature()
    t.celsius = 25.0
    println(t.celsius)
    // t.celsius = -300.0 // throws
}

Pole zapasowe generowane automatycznie

Jeśli getter lub setter używa field, Kotlin generuje pole zapasowe. Jeśli żadne z nich go nie używa, pole nie jest tworzone — właściwość jest wyłącznie obliczana.

class Counter {
    var count: Int = 0
        set(value) {
            println("Setting count from $field to $value")
            field = value
        }
}
fun main() {
    val c = Counter()
    c.count = 5
    c.count = 10
}

Setter z efektami ubocznymi

Używaj własnych setterów do rejestrowania, powiadamiania o zmianach lub synchronizowania powiązanego stanu.

class Brightness {
    var level: Int = 50
        set(value) {
            val clamped = value.coerceIn(0, 100)
            println("Brightness -> $clamped")
            field = clamped
        }
}
fun main() {
    val b = Brightness()
    b.level = 75
    b.level = 150 // clamps to 100
    println(b.level)
}

Prywatny setter

Oznacz setter jako private, aby udostępnić interfejs tylko do odczytu, jednocześnie umożliwiając modyfikowanie wartości wewnątrz klasy.

class Score {
    var value: Int = 0
        private set
    fun increment() { value++ }
    fun reset() { value = 0 }
}
fun main() {
    val s = Score()
    s.increment(); s.increment()
    println(s.value) // 2
    // s.value = 100 // ERROR: setter is private
}

Walidacja w setterze

Własne settery są naturalnym miejscem do przeprowadzania walidacji danych wejściowych.

class Email {
    var address: String = ""
        set(value) {
            require(value.contains("@")) { "invalid email" }
            field = value
        }
}
fun main() {
    val e = Email()
    e.address = "ada@example.com"
    println(e.address)
}

Getter z logiką

Gettery mogą przekształcać zapisany stan — na przykład formatować zapisaną wartość lub stosować wartość zastępczą.

class Profile(_name: String?) {
    var rawName: String? = _name
    val displayName: String
        get() = rawName ?: "(unset)"
}
fun main() {
    val p = Profile(null)
    println(p.displayName) // (unset)
}

Porównanie val i var

Właściwości val mają tylko getter, bez settera, natomiast właściwości var mają oba.

class Box {
    val readOnly: Int get() = 42
    var readWrite: Int = 0
}
fun main() {
    println(Box().readOnly)
    val b = Box(); b.readWrite = 5; println(b.readWrite)
}

Częsty błąd: rekurencja

Nie należy używać nazwy właściwości we własnym accessorze — powoduje to nieskończoną rekurencję. Zamiast tego należy użyć field.

class Wrong {
    var x: Int = 0
        set(value) {
            // x = value // INFINITE RECURSION — calls setter again
            field = value // CORRECT
        }
}
fun main() {
    val w = Wrong(); w.x = 42; println(w.x)
}

Szybkie sprawdzenie

Do czego odnosi się identyfikator field wewnątrz własnego settera?

Podsumowanie

Należy przesłonić get() i set(), aby dodać logikę do dostępu do właściwości. W accessorach należy używać field do odczytu i zapisu pola przechowującego wartość. Settery należy oznaczać jako private, aby utworzyć publiczne API tylko do odczytu; gdy wartość jest zawsze wyliczana, należy używać właściwości obliczanych (bez pola przechowującego).

Często zadawane pytania

Czy lekcja „Własne gettery i settery z field” jest bezpłatna?

Tak — pełny tekst „Własne gettery i settery z field” 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łasne gettery i settery z field”?

Pisz właściwości obliczane i własne settery z użyciem słowa kluczowego backing field. Ć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 3 z 4.

Ile czasu zajmuje lekcja „Własne gettery i settery z field”?

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. Konstruktor główny i parametry właściwości
  2. Bloki init i kolejność inicjalizacji
  3. Własne gettery i settery z field
  4. lateinit i leniwa inicjalizacja
← Powrót do Kotlin Academy