Saya bertanya-tanya apakah ada cara untuk memeriksa apakah suatu lateinit
variabel telah diinisialisasi. Sebagai contoh:
class Foo() {
private lateinit var myFile: File
fun bar(path: String?) {
path?.let { myFile = File(it) }
}
fun bar2() {
myFile.whateverMethod()
// May crash since I don't know whether myFile has been initialized
}
}
File?
) dan periksa apakah itu null?allSeries
varseriesDir?.listFiles()?.map { it.name }?.toTypedArray()
, yang tidak terlalu "cantik"if (seriesDir != null) {
allSeries = seriesDir.listFiles().map { it.name }.toTypedArray()
}
Jawaban:
Ada
lateinit
peningkatan di Kotlin 1.2 yang memungkinkan untuk memeriksa status inisialisasilateinit
variabel secara langsung:Lihat pengumuman di blog JetBrains atau proposal KEEP .
UPDATE: Kotlin 1.2 telah dirilis. Anda dapat menemukan
lateinit
peningkatan di sini:sumber
lateinit
juga untuk variabel lokal, lihat kotlinlang.org/docs/reference/…::
sebelumnyafile
?Menggunakan
.isInitialized
properti, seseorang dapat memeriksa status inisialisasi dari variabel lateinit.sumber
Cobalah untuk menggunakannya dan Anda akan menerima
UninitializedPropertyAccessException
jika itu tidak diinisialisasi.lateinit
khusus untuk kasus di mana bidang diinisialisasi setelah konstruksi, tetapi sebelum penggunaan aktual (model yang menggunakan kerangka kerja injeksi paling banyak). Jika ini bukan use case Andalateinit
mungkin bukan pilihan yang tepat.EDIT: Berdasarkan apa yang ingin Anda lakukan seperti ini akan bekerja lebih baik:
sumber
lateinit
) telah diinisialisasi. Dengan kata lain: Saya ingin tombol dinonaktifkan selama variabel belum diinisialisasi. Apakah ada cara yang baik untuk melakukan itu?isNull
penjilidan untuk menonaktifkan tombol lainnya.Anda dapat dengan mudah melakukan ini dengan:
atau
Tetapi jika Anda berada di dalam pendengar atau kelas dalam, lakukan ini:
Catatan: Pernyataan di atas berfungsi dengan baik jika Anda menulisnya di file yang sama (kelas yang sama atau kelas dalam) di mana variabel dideklarasikan tetapi ini tidak akan berfungsi jika Anda ingin memeriksa variabel kelas lain (bukan superclass atau dideklarasikan dalam file lain) , misalnya:
Dan untuk memeriksa apakah str diinisialisasi:
Apa yang kita lakukan di sini mengakses bidang
str
dariTest
kelas diTest2
kelas. Dan kami mendapatkan bidang dukungan kesalahan var tidak dapat diakses pada saat ini. Periksa pertanyaan yang sudah diajukan tentang ini.sumber
Jawaban yang diterima memberi saya kesalahan kompilator
Kotlin 1.3+
, saya harus menyebutkanthis
kata kunci sebelumnya secara eksplisit::
. Di bawah ini adalah kode yang berfungsi.sumber
Untuk memeriksa apakah a
lateinit var
diinisialisasi atau tidak digunakan.isInitialized
pada referensi ke properti itu:sumber
::
sebelumnyabar
?Bytecode mengatakan ... bla bla ..
L2 LOCALVARIABLE $ Lcom ini / takharsh / ecdh / MainActivity; L0 L2 0 MAXSTACK = 2 MAXLOCALS = 1
Kotlin membuat variabel lokal ekstra dari instance yang sama dan memeriksa apakah itu null atau tidak, jika nol lalu melempar 'throwUninitializedPropertyAccessException' yang lain mengembalikan objek lokal. Bytecode di atas dijelaskan di sini Solusi Karena kotlin 1.2 memungkinkan untuk memeriksa cuaca lateinit var telah diinisialisasi atau tidak menggunakan
.isInitialized
sumber