Kotlin Academy · Pelajaran

lateinit dan Pemulaan Tertunda

Gunakan lateinit untuk sifat yang diberikan nilai kemudian dan by lazy untuk pengiraan tertunda.

Pelajaran 4 daripada 413 langkah

lateinit dan Pemulaan Tertunda ialah pelajaran Kotlin Academy percuma di CoddyKit. Ini ialah pelajaran 4 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.

Dua Alat untuk Persediaan Lewat

Kadang-kadang anda tidak dapat memulakan sifat semasa pembinaan. Kotlin menyediakan lateinit (untuk var yang ditetapkan kemudian) dan by lazy (untuk val yang dihitung pada capaian pertama).

Asas lateinit

lateinit var menangguhkan pemulaan. Pemboleh ubah itu mestilah var yang bukan null dan bukan primitif. Capaian sebelum penetapan akan menghasilkan UninitializedPropertyAccessException.

class Service {
    lateinit var name: String
    fun init(value: String) { name = value }
}
fun main() {
    val s = Service()
    s.init("MyService")
    println(s.name)
}

Mengapa Menggunakan lateinit?

Gunakan lateinit untuk suntikan kebergantungan, lekapan ujian atau kitar hayat yang diurus rangka kerja (paparan Android, bean Spring) apabila pemulaan berlaku di luar pembina.

class Repository {
    lateinit var db: String   // assigned later by DI framework
    fun query() = "querying $db"
}
fun main() {
    val r = Repository()
    r.db = "postgres://localhost"
    println(r.query())
}

Semakan isInitialized

Anda boleh menyemak sama ada sifat lateinit telah ditetapkan menggunakan ::propName.isInitialized.

class Foo {
    lateinit var bar: String
    fun status() = if (::bar.isInitialized) "set to $bar" else "unset"
}
fun main() {
    val f = Foo()
    println(f.status()) // unset
    f.bar = "hi"
    println(f.status())
}

Sekatan lateinit

Anda tidak boleh menggunakan lateinit pada jenis primitif (Int, Boolean dan sebagainya), jenis boleh-nil, atau val. Pengkompil menguatkuasakan peraturan ini.

// VALID:
lateinit var name: String
// INVALID:
// lateinit var count: Int       // primitives not allowed
// lateinit val constant: String // val not allowed
// lateinit var maybe: String?   // nullable not allowed
fun main() { name = "ok"; println(name) }

Asas by lazy

by lazy menangguhkan pemulaan val sehingga capaian pertama. Lambda dijalankan sekali dan hasilnya disimpan untuk kegunaan seterusnya.

val expensive: String by lazy {
    println("Computing...")
    "result"
}
fun main() {
    println(expensive) // Computing... then result
    println(expensive) // result (cached)
}

Mengapa Menggunakan by lazy?

Gunakan by lazy apabila pemulaan memerlukan kos yang tinggi dan mungkin tidak diperlukan (simpan hasilnya untuk kegunaan kemudian), atau apabila pemulaan bergantung pada sifat lain yang telah dibina.

class Config {
    val parsed: Map<String, String> by lazy {
        println("parsing config...")
        mapOf("host" to "localhost", "port" to "8080")
    }
}
fun main() {
    val c = Config()
    println("config object created — not parsed yet")
    println(c.parsed["host"]) // now parses
    println(c.parsed["port"]) // cached
}

Mod Keselamatan Benang lazy

Secara lalai, by lazy menggunakan LazyThreadSafetyMode.SYNCHRONIZED. Gunakan PUBLICATION untuk pemulaan yang selamat dengan pelaksanaan serentak, dan NONE untuk prestasi satu benang.

val safe: String by lazy { "thread-safe" }
val fast: String by lazy(LazyThreadSafetyMode.NONE) { "fast, single-thread" }
fun main() {
    println(safe)
    println(fast)
}

lateinit berbanding lazy

lateinit: var yang ditetapkan dari luar. by lazy: val yang dihitung oleh sifat itu sendiri pada capaian pertama.

class Demo {
    lateinit var injected: String         // assigned by caller
    val computed: String by lazy { "computed once" }
}
fun main() {
    val d = Demo()
    d.injected = "from outside"
    println(d.injected)
    println(d.computed)
}

lazy Membaca Sifat Lain

Sifat lazy boleh membaca sifat lain yang telah dimulakan lebih awal dan menggabungkannya.

class User(val first: String, val last: String) {
    val fullName: String by lazy { "$first $last" }
}
fun main() {
    val u = User("Ada", "Lovelace")
    println(u.fullName)
}

Corak Praktikal

Gabungkan lateinit untuk DI dan by lazy untuk keadaan terbitan dalam kelas yang sama.

class App {
    lateinit var config: Map<String, String>
    val host: String by lazy { config["host"] ?: "localhost" }
}
fun main() {
    val app = App()
    app.config = mapOf("host" to "api.example.com")
    println(app.host) // api.example.com
}

Semakan Pantas

Kata kunci manakah yang menangguhkan pemulaan sifat val sehingga capaian pertama?

Rumusan

Gunakan lateinit var untuk sifat boleh ubah bukan null yang ditetapkan kemudian oleh rangka kerja atau DI. Gunakan val by lazy untuk nilai baca sahaja yang perlu dihitung sekali pada capaian pertama. Semak status menggunakan ::prop.isInitialized.

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 “lateinit dan Pemulaan Tertunda” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Kotlin Academy, termasuk “lateinit dan 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 “lateinit dan Pemulaan Tertunda”?

Gunakan lateinit untuk sifat yang diberikan nilai kemudian dan by lazy untuk pengiraan tertunda. 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 4 daripada 4.

Berapa lamakah pelajaran “lateinit dan 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. Pembina Utama dan Parameter Sifat
  2. Blok init dan Susunan Pemulaan
  3. Getter dan Setter Tersuai dengan field
  4. lateinit dan Pemulaan Tertunda
← Kembali ke Kotlin Academy