Pertimbangkan blok Kotlin berikut.
var nullableInt: Int? = null
if (nullableInt != null) {
val checkedInt: Int = nullableInt
print("not-null-branch")
} else {
print("null-branch")
}
Android Studio memberi tahu saya bahwa smart cast dari Int?ke Inttidak memungkinkan, karena nullableIntbisa berubah. Saya memahami bahwa ini mungkin menjadi masalah pada kode multithread.
Salah satu cara untuk menangani masalah ini adalah dengan membuat cast eksplisit val checkedInt: Int = nullableInt!!, tetapi jika saya akan menggunakan kode di lingkungan multithread, itu tidak disarankan.
Ada beberapa pertanyaan yang sangat dekat tentang SO mengenai topik ini. Namun, saya tidak menemukan jawaban satistafctory di salah satu jawaban yang saya temukan:
Di Kotlin, apa cara idiomatik untuk menangani nilai nullable, mereferensikan atau mengonversinya membahas mengapa masalah muncul, tetapi tidak memberikan saran tentang cara menanganinya
Kotlin menghindari smart cast untuk pemeriksaan null memiliki cabang if-not-null yang mengembalikan nilai bukan null, sehingga ?.let{} :? {}konstruksi berfungsi di sana. Karena cabang not-null saya mengembalikan null, kedua cabang akan berjalan.
Kotlin "Smart cast tidak mungkin, karena propertinya bisa saja diubah saat ini" hanya berkaitan dengan cabang-bukan-null dan tidak-cabang-null, sehingga ?.let{}konstruksinya tampak benar. Di utas itu, mereka memberikan saran tentang mengambil salinan lokal sebelum ifpernyataan, yang dapat dilakukan dalam kasus saya juga. Sayangnya tidak terlalu elegan, dan saya harap ada alternatif lain.
Apakah ada cara untuk menangani percabangan bersyarat null ini dengan cara yang aman nol tanpa mengambil salinannya?
Saya memahami bahwa jawabannya berpotensi menjadi "tergantung". Jika demikian, harap katakan dan jelaskan alasannya.
.letsebagai ganti?.letKarena .letfungsi ekstensi ditentukan untuk semua jenis, termasuk yang nullable, Anda sebenarnya dapat memanggilnya tanpa ?.operator panggilan aman . Saat Anda melakukan itu, lambda akan selalu dipanggil, bahkan untuk nullnilai. Parameter di dalam letblok akan menjadi null jika penerima adalah nullable.
Namun, parameter lambda adalah memenuhi syarat untuk pengecoran pintar , karena tidak bisa berubah.
Inilah perbedaannya:
x.let { it -> /* This always runs. 'it' can be null if 'x' is null */ }
x?.let { it -> /* This only runs if 'x' is not null. 'it' is never null. */ }
Menerapkannya pada contoh Anda, Anda dapat menulis ini:
var nullableInt: Int? = null
nullableInt.let {
if (it != null) {
doSomethingWith(it)
} else {
doSomethingElse()
}
}
Anda tidak dapat mulai mentransmisikan properti karena thread lain mungkin sedang memodifikasinya. Tidak ada cara logis untuk menyiasatinya. Bahasa tersebut telah menyediakan cara yang tidak aman untuk melakukannya dengan !!yang telah Anda sebutkan.
Membuat salinan referensi lokal (baik secara manual atau dengan menggunakan fungsi lingkup seperti withatau let) adalah hal yang sepele jadi itu bukan sesuatu yang perlu Anda khawatirkan.
Pendapat pribadi saya adalah variabel lokal adalah cara terbersih dan paling mudah dibaca untuk melakukannya. Anda menghindari penumpukan blok yang Anda miliki dengan fungsi cakupan.
val myVar = myProp
if (myVar != null) {
} else {
}
Saya pikir cara terbersih dengan fungsi ruang lingkup adalah dengan menggunakan with. Pembacaannya lebih baik daripada letsaat Anda menangani kedua cabang.
with(myProp) {
if (this != null) {
} else {
}
}
Untuk cara singkat menangani kedua cabang, berikut ini cara kerjanya. Saya menganggap alsomenjadi sedikit lebih kuat daripada letuntuk situasi ini, karena Anda tidak dapat secara tidak sengaja menjalankan kedua cabang dengan mengembalikan null dari lambda pertama. Tapi keterbacaan menderita karena singkat ini.
myProp?.also {
// not null it
} ?: run {
// null
}
Jana Duggar terbuka tentang pencarian cintanya. Inilah semua yang dia katakan tentang topik dan jendela lima tahun untuk menikah.
Bintang 'Outlander' Sam Heughan baru-baru ini mengungkapkan apa yang akan dia ambil dari lokasi syuting untuk mengingat Jamie Fraser, peran yang membuatnya menjadi bintang.
'She Loves You' ditulis dalam satu jam, direkam dalam sehari, dan merupakan lagu The Beatles dengan salah satu penampilan terbaik dalam karir mereka.
Dolly Parton dan Nenek Bessie memiliki hubungan khusus. Nenek Parton sakit parah, tapi itu tidak menghentikan Dolly untuk mengerjainya.
Anda mungkin mengira kayu ek atau hickory kuat, tetapi jika berbicara tentang kayu terkeras di dunia, keduanya tidak ada yang mendekati.
Lautan memang penuh keindahan, tetapi juga menyembunyikan beberapa makhluk laut paling menakutkan di planet ini. Banyak dari hewan ini bersembunyi jauh di bawah permukaan laut, di dunia laut dalam yang gelap dan bertekanan tinggi.
Jika Anda sedang melawan monster musuh atau bersiap untuk skenario PvP, mengetahui pesona pedang terbaik di Minecraft dapat memberi Anda keuntungan besar. Memikat pedang memungkinkan Anda menghasilkan lebih banyak kerusakan, meningkatkan jumlah monster yang dijatuhkan, dan memperpanjang daya tahan pedang Anda.
Ketika orang berbicara tentang negara sosialis, mereka sering membayangkan kendali penuh pemerintah dan tanpa kepemilikan swasta. Namun dalam praktiknya, ekonomi sosialis sangat bervariasi.
“Children” merilis cameo dengan nama besar dan beberapa berita buruk
RAV4 ini diklaim dalam kondisi sangat baik dan siap digunakan untuk permainan kursi musik.
Rekaman drone memperlihatkan petugas pemadam kebakaran yang tampak kesulitan memadamkan api.
Eyes of Wakanda terhubung langsung dengan MCU, ditambah pembaruan tentang X-Men '97, What If..., Daredevil, dan banyak lagi.
'Laguna Beach' mengikuti kehidupan siswa sekolah menengah Lauren Conrad, Kristin Cavallari, Stephen Colletti, dan banyak lagi pada pertengahan tahun 2000-an. Berikut ini adalah tempat tinggal para pemeran serial realitas MTV tersebut sekarang.
Ava Gardner pernah menikah dengan Mickey Rooney dan Frank Sintra, dan ia pernah berpacaran dengan beberapa bintang Hollywood lainnya. Berikut ini kilas balik riwayat berpacaran Ava Gardner.
John Cleese menikahi istrinya, Jennifer Wade, pada tahun 2012. Berikut semua yang perlu Anda ketahui tentang istri John Cleese, Jennifer Wade.
Berikut semua yang perlu Anda ketahui tentang Francie Frane, mantan peternak yang menikah dengan Dog the Bounty Hunter.
Itu mengejutkan saya Tiba-tiba seperti yang sering terjadi Ini di tengah jalan lagi <Tidak, bukan yang di pasifik Anda merah marun, yang di karnaval> Setiap berita utama keras…..
Di tahun 2022, dengan dirilisnya GPT-3, kemampuan menulis sepertinya menjadi kurang penting. Dengan AI, orang dengan tulisan yang buruk juga dapat menghasilkan staf yang berkualitas.
Di dunia yang serba cepat dan kompetitif saat ini, karier seseorang memainkan peran penting dalam pertumbuhan pribadi, stabilitas keuangan, dan kepuasan hidup secara keseluruhan. Namun, banyak orang menemukan diri mereka terjebak dalam siklus stagnasi dan ketidakpuasan tanpa henti, secara bertahap menyia-nyiakan kehidupan profesional mereka.
Minggu lalu saya melihat siaran pers, dikirim melalui PressGazette (situs web berita media Inggris). Artikel tersebut mengumumkan bahwa Acast, perusahaan hosting dan periklanan podcast Scandi, akan memimpin konsorsium penerbit "mungkin yang paling berpengaruh" dalam podcasting.