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
- Konstruktor główny i parametry właściwości
- Bloki init i kolejność inicjalizacji
- Własne gettery i settery z field
- lateinit i leniwa inicjalizacja