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