Kotlin Academy · Lekcja

Ograniczenia

Czego nie mogą robić klasy wartości

Lekcja 4 z 413 kroki

Ograniczenia to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 4 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.

Znajomość ograniczeń

Klasy wartości są przydatne, ale mają ograniczenia. Zrozumienie tych ograniczeń pomaga wybrać właściwe narzędzie i uniknąć niespodzianek.

Dokładnie jedna właściwość

Klasa wartości opakowuje pojedynczą wartość. Do grupowania wielu pól potrzebna jest zwykła klasa lub data class.

// @JvmInline value class Range(val lo: Int, val hi: Int) // not allowed

data class Range(val lo: Int, val hi: Int)

fun main() {
    println(Range(1, 10))
}

Brak dodatkowego stanu poza wartością

Klasy wartości nie mogą mieć pól zaplecza innych niż pojedyncza właściwość konstruktora. Dodatkowy stan var z polem zaplecza jest niedozwolony.

@JvmInline
value class Counter(val value: Int) {
    // val cached: Int = value * 2  // not allowed: extra backing field
    val doubled: Int get() = value * 2  // computed is fine
}

fun main() {
    println(Counter(3).doubled)
}

Brak dziedziczenia

Klasy wartości są niejawnie oznaczone jako final. Nie mogą rozszerzać innych klas ani być rozszerzane. Mogą jedynie implementować interfejsy.

interface Named { val label: String }

@JvmInline
value class Tag(val text: String) : Named {
    override val label: String get() = text
}

fun main() {
    println(Tag("urgent").label)
}

Powrót kosztu boxingu

Obietnica braku narzutu znika, gdy wartość jest używana jako nullable, typ generyczny lub typ interfejsu. Kompilator opakowuje ją wtedy w rzeczywisty obiekt.

@JvmInline
value class Id(val raw: Int)

fun main() {
    val list: List<Id> = listOf(Id(1), Id(2)) // boxed inside the list
    println(list.map { it.raw })
}

Brak tożsamości

Klasy wartości nie mają trwałej tożsamości referencyjnej. Równość referencyjna z użyciem === nie ma znaczenia, a klas wartości nie można używać tam, gdzie tożsamość obiektu ma znaczenie, na przykład jako blokady synchronizacji.

@JvmInline
value class Code(val value: Int)

fun main() {
    val a = Code(5)
    val b = Code(5)
    println(a == b)   // structural equality works
}

Nie można używać lateinit ani delegowania

Nie można zastosować lateinit do wartości bazowej, a klasy wartości nie obsługują delegowania właściwości dla swojego jedynego pola. Wartość musi zostać ustawiona w konstruktorze.

@JvmInline
value class Slug(val value: String)

fun main() {
    val s = Slug("hello-world") // must be provided up front
    println(s.value)
}

Mangling nazw na JVM

Na JVM funkcje przyjmujące parametry klas wartości otrzymują w kodzie bajtowym nazwy poddane manglingowi, aby uniknąć konfliktów. Utrudnia to interoperacyjność z Javą; wywołujący z Javy mogą nie widzieć tych funkcji w czytelny sposób.

@JvmInline
value class Hz(val value: Int)

fun tune(freq: Hz) = freq.value

fun main() {
    println(tune(Hz(440))) // simple from Kotlin; mangled from Java
}

Nie dla opakowań wielopolowych

Jeśli potrzebne są dwie właściwości, klasa wartości jest niewłaściwym narzędziem. Należy użyć data class, akceptując alokację w zamian za bogatszą strukturę.

data class Coordinate(val lat: Double, val lng: Double)

fun main() {
    println(Coordinate(41.0, 29.0))
}

Podsumowanie ograniczeń

Klasy wartości nie mogą:

  • Przechowywać więcej niż jednej właściwości
  • Mieć dodatkowych pól zaplecza ani używać lateinit
  • Dziedziczyć po klasach ani być przez klasy dziedziczone
  • Zapewniać tożsamości referencyjnej
  • Zawsze unikać boxingu

Rozważny wybór

Klasy wartości należy stosować dla pojedynczych, zweryfikowanych i bezpiecznych typowo wartości. Do grupowania danych należy używać data class. Alias typu zapewnia wyłącznie czytelność, bez dodatkowego bezpieczeństwa. Każde z tych narzędzi ma swoje zastosowanie.

Szybkie sprawdzenie

Warto sprawdzić zrozumienie ograniczeń klas wartości.

Podsumowanie

Omówiono ograniczenia klas wartości:

  • Pojedyncza właściwość, bez dodatkowych pól zaplecza
  • Brak dziedziczenia i tożsamości
  • Boxing powraca przy użyciu jako nullable, typ generyczny lub interfejs
  • Mangling nazw na JVM utrudnia interoperacyjność z Javą

Należy dopasować narzędzie do potrzeby.

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 „Ograniczenia” jest bezpłatna?

Tak — pełny tekst „Ograniczenia” 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 „Ograniczenia”?

Czego nie mogą robić klasy wartości Ć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 4 z 4.

Ile czasu zajmuje lekcja „Ograniczenia”?

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. Aliasy typów
  2. Klasу wartości inline
  3. Przypadki użycia
  4. Ograniczenia
← Powrót do Kotlin Academy