by lazy: Penyelaman Mendalam Pemulaan Tertunda
Terokai mod pemulaan tertunda: SYNCHRONIZED, PUBLICATION dan NONE.
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.
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
- by lazy: Penyelaman Mendalam Pemulaan Tertunda
- Delegat observable dan vetoable
- Menulis Delegat ReadWriteProperty Tersuai
- Delegat untuk Keutamaan, Sifat Disokong Map dan Logging