Kotlin Academy · Oppitunti

by lazy: perusteellinen katsaus lykättyyn alustamiseen

Tutustukaa lazy-alustamisen tiloihin: SYNCHRONIZED, PUBLICATION ja NONE.

Oppitunti 1/413 vaihetta

by lazy: perusteellinen katsaus lykättyyn alustamiseen on ilmainen Kotlin Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Kotlin Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.

Mikä on by lazy?

by lazy siirtää val-ominaisuuden alustamisen ensimmäiseen käyttöön. Lambda suoritetaan kerran, ja tulos tallennetaan välimuistiin.

val greeting: String by lazy {
    println("Computing...")
    "Hello, Kotlin!"
}
fun main() {
    println(greeting) // prints Computing... then Hello, Kotlin!
    println(greeting) // prints Hello, Kotlin! (cached)
}

Lazy-syntaksi

by lazy-delegaatti ottaa vastaan lambdan, joka palauttaa ominaisuuden määrittelystä päätellyn arvotyypin.

val pi: Double by lazy { Math.PI }
val appName: String by lazy { "MyApp v1.0" }
fun main() {
    println(pi)      // 3.141592653589793
    println(appName) // MyApp v1.0
}

SYNCHRONIZED-tila (oletus)

Oletuksena lazy käyttää LazyThreadSafetyMode.SYNCHRONIZED-tilaa: vain yksi säie alustaa arvon.

val heavyResource: String by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
    Thread.sleep(100) // simulate work
    "Resource ready"
}
fun main() { println(heavyResource) }

PUBLICATION-tila

PUBLICATION sallii useiden säikeiden alustaa arvon samanaikaisesti; ensimmäinen tulos voittaa. Käyttäkää sitä, kun alustus on edullinen eikä sisällä sivuvaikutuksia.

val config: Map<String, String> by lazy(LazyThreadSafetyMode.PUBLICATION) {
    mapOf("host" to "localhost", "port" to "8080")
}
fun main() { println(config["host"]) }

NONE-tila

NONE-tilassa ei ole synkronoinnin aiheuttamaa suorituskykykustannusta. Käyttäkää sitä vain yksisäikeisissä tilanteissa, joissa suorituskyky on tärkeää.

val singleThreadValue: Int by lazy(LazyThreadSafetyMode.NONE) {
    42
}
fun main() { println(singleThreadValue) }

Lazy luokassa

Luokan sisällä oleva by lazy alustetaan ensimmäisellä ominaisuuden käyttökerralla. Tämä sopii kalliisiin laskutoimituksiin, jotka liittyvät ilmentymän tilaan.

class DatabaseConnection(val url: String) {
    val pool: String by lazy {
        println("Connecting to $url")
        "Pool@$url"
    }
}
fun main() {
    val db = DatabaseConnection("localhost:5432")
    println(db.pool)
}

Lazy ja lateinit

Käyttäkää by lazy-rakennetta val-ominaisuuksille, joiden alustus on monimutkainen. Käyttäkää lateinit-rakennetta var-ominaisuuksille, jotka asetetaan ulkoisesti, esimerkiksi testeissä tai riippuvuuksien injektoinnissa.

class MyService {
    val computed: List<Int> by lazy { (1..100).toList() }
    lateinit var injected: String
}
fun main() {
    val s = MyService()
    s.injected = "injected value"
    println(s.computed.size)
    println(s.injected)
}

isInitialized-tarkistus

Tarkistakaa, onko lazy-ominaisuus alustettu, käyttämällä .isInitialized()-funktiota — mutta vain delegaattiviittauksen kautta.

val myLazy: String by lazy { "initialized" }
fun main() {
    val ref = ::myLazy
    // No direct isInitialized on val lazy, but we can check via delegate
    println(myLazy)
}

Lazy ja riippuvuudet

Lazy-ominaisuudet voivat viitata muihin lazy-ominaisuuksiin, jolloin muodostuu lazy-alustusketju.

val baseUrl: String by lazy { "https://api.example.com" }
val usersUrl: String by lazy { "$baseUrl/users" }
val postsUrl: String by lazy { "$baseUrl/posts" }
fun main() {
    println(usersUrl)
    println(postsUrl)
}

Käytännössä: singleton-palvelu

Käyttäkää by lazy-rakennetta object-määrittelyissä, kun haluatte alustaa raskaat singletonit vasta tarvittaessa.

object Analytics {
    val client: String by lazy {
        println("Initializing analytics client")
        "AnalyticsClient@ready"
    }
}
fun main() {
    println("App started")
    println(Analytics.client) // initialized on first use
    println(Analytics.client) // cached
}

Säännöllisten lausekkeiden lazy-kääntäminen

Säännöllisen lausekkeen kääntäminen on kallista. Käyttäkää by lazy-rakennetta kääntämiseen kerran ja tuloksen uudelleenkäyttöön, jotta toistuva kustannus vältetään.

val emailRegex: Regex by lazy {
    Regex("^[A-Za-z0-9+_.-]+@(.+)$")
}
fun isValidEmail(email: String) = emailRegex.matches(email)
fun main() {
    println(isValidEmail("user@example.com")) // true
    println(isValidEmail("bad-email"))         // false
}

Pikatarkistus

Mitä lazy-tilaa pitäisi käyttää yksisäikeisessä ympäristössä parhaan suorituskyvyn saavuttamiseksi?

Kertaus

by lazy suorittaa lambdansa kerran ensimmäisellä käyttökerralla ja tallentaa tuloksen välimuistiin. Valitkaa SYNCHRONIZED (oletus) säieturvallisuutta varten, PUBLICATION samanaikaiseen idempotenttiin alustamiseen ja NONE yksisäikeiseen suorituskykyyn.

Aloita maksutta

Opi Kotlin tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”by lazy: perusteellinen katsaus lykättyyn alustamiseen” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Kotlin Academy-oppimispolun 3 oppituntia, myös oppitunnin “by lazy: perusteellinen katsaus lykättyyn alustamiseen”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”by lazy: perusteellinen katsaus lykättyyn alustamiseen”?

Tutustukaa lazy-alustamisen tiloihin: SYNCHRONIZED, PUBLICATION ja NONE. Harjoittelet Kotlin Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Kotlin Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Kotlin Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”by lazy: perusteellinen katsaus lykättyyn alustamiseen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Kotlin Academy-oppitunnilla?

Kyllä. Jokainen Kotlin Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. by lazy: perusteellinen katsaus lykättyyn alustamiseen
  2. observable- ja vetoable-delegaatit
  3. Mukautetun ReadWriteProperty-delegaatin kirjoittaminen
  4. Delegaatit asetuksille, Map-taustaisille ominaisuuksille ja lokitukselle
← Takaisin: Kotlin Academy