0Pricing
Kotlin Academy · Lekcja

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 class z 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

  1. Aliasy typów
  2. Klasу wartości inline
  3. Przypadki użycia
  4. Ograniczenia
← Powrót do Kotlin Academy