Kotlin Academy · Pelajaran

by lazy: Penyelaman Mendalam Pemulaan Tertunda

Terokai mod pemulaan tertunda: SYNCHRONIZED, PUBLICATION dan NONE.

Pelajaran 1 daripada 413 langkah

by lazy: Penyelaman Mendalam Pemulaan Tertunda ialah pelajaran Kotlin Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Kotlin Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Kotlin Academy merangkumi sejumlah 4 pelajaran.

Apakah by lazy

by lazy menangguhkan pemulaan val sehingga akses pertama. Lambda dijalankan sekali dan hasilnya dicache.

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

Sintaks Lazy

Delegasi by lazy menerima lambda yang mengembalikan jenis nilai yang disimpulkan daripada pengisytiharan sifat.

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
}

Mod SYNCHRONIZED (Lalai)

Secara lalai, lazy menggunakan LazyThreadSafetyMode.SYNCHRONIZED: hanya satu bebenang memulakan nilai tersebut.

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

Mod PUBLICATION

PUBLICATION membenarkan beberapa bebenang memulakan nilai secara serentak; hasil pertama akan digunakan. Gunakannya apabila pemulaan adalah murah dan tanpa kesan sampingan.

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

Mod NONE

NONE tidak mempunyai overhed penyegerakan. Gunakannya hanya dalam konteks satu bebenang apabila prestasi penting.

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

Lazy dalam Kelas

by lazy di dalam kelas memulakan nilai pada akses sifat pertama, dan berguna untuk pengiraan mahal yang berkaitan dengan keadaan tika.

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 berbanding lateinit

Gunakan by lazy untuk val dengan pemulaan yang kompleks. Gunakan lateinit untuk var yang ditetapkan dari luar (contohnya, dalam ujian atau suntikan kebergantungan).

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)
}

Semakan isInitialized

Semak sama ada sifat lazy telah dimulakan dengan .isInitialized() — tetapi hanya melalui rujukan delegasi.

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 dengan Kebergantungan

Sifat lazy boleh merujuk sifat lazy yang lain, lalu membentuk rantaian pemulaan lazy.

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)
}

Praktikal: Perkhidmatan Singleton

Gunakan by lazy dalam pengisytiharan object untuk memulakan singleton yang menggunakan banyak sumber hanya apabila diperlukan.

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
}

Penyusunan Regex Secara Lazy

Penyusunan regex memerlukan kos yang tinggi. Gunakan by lazy untuk menyusunnya sekali dan menggunakannya semula, sekali gus mengelakkan overhed berulang.

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
}

Semakan Pantas

Mod lazy yang manakah patut anda gunakan dalam persekitaran satu bebenang untuk prestasi maksimum?

Ulang Kaji

by lazy menjalankan lambda sekali pada akses pertama dan mencache hasilnya. Pilih SYNCHRONIZED (lalai) untuk keselamatan bebenang, PUBLICATION untuk pemulaan idempoten serentak dan NONE untuk prestasi satu bebenang.

Percuma untuk bermula

Pelajari Kotlin dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
51
Pelajaran
203

Soalan Lazim

Adakah pelajaran “by lazy: Penyelaman Mendalam Pemulaan Tertunda” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Kotlin Academy, termasuk “by lazy: Penyelaman Mendalam Pemulaan Tertunda”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Kotlin Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “by lazy: Penyelaman Mendalam Pemulaan Tertunda”?

Terokai mod pemulaan tertunda: SYNCHRONIZED, PUBLICATION dan NONE. Anda berlatih Kotlin Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Kotlin Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Kotlin Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “by lazy: Penyelaman Mendalam Pemulaan Tertunda” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Kotlin Academy ini?

Ya. Setiap pelajaran Kotlin Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. by lazy: Penyelaman Mendalam Pemulaan Tertunda
  2. Delegat observable dan vetoable
  3. Menulis Delegat ReadWriteProperty Tersuai
  4. Delegat untuk Keutamaan, Sifat Disokong Map dan Logging
← Kembali ke Kotlin Academy