Di Kotlin jika Anda tidak ingin menginisialisasi properti kelas di dalam konstruktor atau di bagian atas badan kelas, Anda pada dasarnya memiliki dua opsi ini (dari referensi bahasa):
lazy () adalah fungsi yang mengambil lambda dan mengembalikan instance Malas yang dapat berfungsi sebagai delegasi untuk mengimplementasikan properti lazy: panggilan pertama untuk mendapatkan () mengeksekusi lambda yang dilewatkan ke lazy () dan mengingat hasilnya, panggilan selanjutnya untuk mendapatkan () cukup kembalikan hasil yang diingat.
Contoh
public class Hello { val myLazyString: String by lazy { "Hello" } }
Jadi panggilan pertama dan panggilan subquential, di mana pun itu, ke myLazyString akan mengembalikan "Halo"
Biasanya, properti yang dideklarasikan memiliki tipe non-null harus diinisialisasi dalam konstruktor. Namun, cukup sering ini tidak nyaman. Misalnya, properti dapat diinisialisasi melalui injeksi dependensi, atau dalam metode pengaturan tes unit. Dalam hal ini, Anda tidak bisa menyediakan inisialisasi non-null di konstruktor, tetapi Anda masih ingin menghindari cek nol ketika mereferensikan properti di dalam tubuh kelas.
Untuk menangani kasus ini, Anda dapat menandai properti dengan pengubah lateinit:
public class MyTest { lateinit var subject: TestSubject @SetUp fun setup() { subject = TestSubject() } @Test fun test() { subject.method() } }
Pengubah hanya dapat digunakan pada properti var dideklarasikan di dalam tubuh kelas (tidak di konstruktor utama), dan hanya ketika properti tidak memiliki pengambil atau penyetel kustom. Jenis properti harus bukan nol, dan tidak boleh tipe primitif.
Jadi, bagaimana memilih dengan benar antara kedua opsi ini, karena keduanya dapat menyelesaikan masalah yang sama?
lateinit
memperlihatkan bidang dukungan dengan visibilitas setter sehingga cara properti diakses dari Kotlin dan dari Jawa berbeda. Dan dari kode Java properti ini dapat disetel menjadinull
tanpa cek di Kotlin. Karenalateinit
itu bukan untuk inisialisasi malas tetapi untuk inisialisasi tidak harus dari kode Kotlin.