Klasу wartości inline
Opakowuj bez dodatkowego narzutu
Klasу wartości inline 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.
Problem opakowywania
Opakowanie typu prostego w klasę zapewnia bezpieczeństwo typów, ale zwykle wiąże się z alokacją na stercie. Klasy wartości zapewniają bezpieczeństwo, a kompilator usuwa opakowanie tam, gdzie jest to możliwe.
Deklarowanie klasy wartości
Klasę @JvmInline value class należy oznaczyć dokładnie jedną właściwością w konstruktorze głównym. Zachowuje się ona jak odrębny typ.
@JvmInline
value class Password(val value: String)
fun main() {
val p = Password("secret")
println(p.value)
}Odrębny typ
W przeciwieństwie do aliasu typu klasa wartości jest osobnym typem. Nie można przypadkowo przekazać zwykłego String tam, gdzie oczekiwany jest Password.
@JvmInline
value class Password(val value: String)
fun login(p: Password) = println("login with " + p.value)
fun main() {
login(Password("hunter2"))
}Brak narzutu
W czasie wykonywania kompilator zwykle wbudowuje wartość bazową, dlatego nie dochodzi do dodatkowej alokacji obiektu. W większości ścieżek wykonania Password jest reprezentowany jako zwykły String.
@JvmInline
value class Meters(val amount: Double)
fun main() {
val d = Meters(5.0)
println(d.amount) // stored inline as a Double
}Metody i właściwości
Klasy wartości mogą zawierać funkcje i właściwości obliczane, tak jak zwykłe klasy.
@JvmInline
value class Celsius(val degrees: Double) {
fun toFahrenheit() = degrees * 9 / 5 + 32
}
fun main() {
println(Celsius(100.0).toFahrenheit())
}Bloki init do walidacji
Blok init pozwala zweryfikować opakowaną wartość podczas tworzenia obiektu, gwarantując, że każda instancja jest poprawna.
@JvmInline
value class Percentage(val value: Int) {
init {
require(value in 0..100) { "out of range" }
}
}
fun main() {
println(Percentage(75).value)
}Właściwości obliczane
Można dodawać właściwości obliczane na podstawie jedynej przechowywanej wartości, utrzymując logikę blisko typu.
@JvmInline
value class Seconds(val value: Int) {
val asMinutes: Double get() = value / 60.0
}
fun main() {
println(Seconds(120).asMinutes)
}Implementowanie interfejsów
Klasy wartości mogą implementować interfejsy, co pozwala używać ich polimorficznie. Uwaga: takie użycie może wymusić boxing, gdy wartość jest traktowana jako typ interfejsu.
interface Describable {
fun describe(): String
}
@JvmInline
value class Money(val cents: Int) : Describable {
override fun describe() = "$" + cents / 100.0
}
fun main() {
println(Money(1599).describe())
}Kiedy występuje boxing
Opakowanie pojawia się ponownie (boxing), gdy wartość jest używana jako nullable, interfejs lub element generycznej kolekcji. W takich przypadkach kompilator tworzy rzeczywisty obiekt — działanie pozostaje poprawne, ale jest mniej wydajne.
@JvmInline
value class Id(val raw: Int)
fun main() {
val direct = Id(1) // inlined
val boxed: Id? = Id(2) // boxed because nullable
println("" + direct.raw + " " + boxed?.raw)
}value class a data class
data class zawsze powoduje alokację i może przechowywać wiele właściwości. value class przechowuje dokładnie jedną właściwość i ma zapewniać brak narzutu. Klas wartości należy używać jako lekkich, bezpiecznych typowo opakowań pojedynczej wartości.
Dlaczego ma to znaczenie
Klasy wartości pozwalają:
- Zapobiegać myleniu parametrów o podobnych typach
- Dołączać walidację do typu prymitywnego
- Zwykle nie ponosić żadnego kosztu w czasie wykonywania
Stanowią bezpieczne typowo rozwiązanie tam, gdzie aliasy typów nie wystarczają.
Szybkie sprawdzenie
Warto sprawdzić zrozumienie klas wartości inline.
Podsumowanie
Omówiono klasy wartości inline:
- Deklarowane jako
@JvmInline value classz jedną właściwością - Odrębny typ, zwykle bez narzutu
- Obsługują metody, właściwości obliczane i walidację w
init - Boxing występuje przy użyciu jako nullable, typ generyczny lub interfejs
Następnie: zastosowania w praktyce.
Często zadawane pytania
Czy lekcja „Klasу wartości inline” jest bezpłatna?
Tak — pełny tekst „Klasу wartości inline” 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 „Klasу wartości inline”?
Opakowuj bez dodatkowego narzutu Ć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 „Klasу wartości inline”?
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
- Aliasy typów
- Klasу wartości inline
- Przypadki użycia
- Ograniczenia