by lazy: perusteellinen katsaus lykättyyn alustamiseen
Tutustukaa lazy-alustamisen tiloihin: SYNCHRONIZED, PUBLICATION ja NONE.
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.
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
- by lazy: perusteellinen katsaus lykättyyn alustamiseen
- observable- ja vetoable-delegaatit
- Mukautetun ReadWriteProperty-delegaatin kirjoittaminen
- Delegaatit asetuksille, Map-taustaisille ominaisuuksille ja lokitukselle