private val repositories = mutableListOf<String>()
private val repositories = ArrayList<String>()
Keduanya adalah daftar yang bisa berubah, lalu apa gunanya dua kata kunci mutableListOf
atau ArrayList
?
atau apakah ada perbedaan besar?
Jawaban:
Satu-satunya perbedaan antara keduanya adalah mengomunikasikan maksud Anda.
Saat Anda menulis val a = mutableListOf()
, Anda mengatakan "Saya ingin daftar yang bisa berubah, dan saya tidak terlalu peduli dengan implementasinya". Saat Anda menulis, sebaliknya val a = ArrayList()
, Anda mengatakan "Saya secara khusus menginginkan ArrayList
".
Dalam praktiknya, dalam implementasi kompilasi Kotlin ke JVM saat ini, pemanggilan mutableListOf
akan menghasilkan ArrayList
, dan tidak ada perbedaan dalam perilaku: setelah daftar dibuat, semuanya akan berperilaku sama.
Sekarang, katakanlah versi Kotlin yang akan datang berubah mutableListOf
untuk mengembalikan jenis daftar yang berbeda.
Lebih mungkin daripada tidak, tim Kotlin hanya akan membuat perubahan itu jika mereka menganggap implementasi baru bekerja lebih baik untuk sebagian besar kasus penggunaan. mutableListOf
kemudian akan meminta Anda menggunakan penerapan daftar baru tersebut secara transparan, dan Anda akan mendapatkan perilaku yang lebih baik secara gratis. Pergi dengan mutableListOf
jika itu terdengar seperti kasus Anda.
Di sisi lain, mungkin Anda menghabiskan banyak waktu berpikir tentang masalah Anda, dan berpikir bahwa ArrayList
benar-benar adalah cocok untuk masalah Anda, dan Anda tidak ingin risiko mendapatkan pindah ke sesuatu yang sub-optimal. Kemudian Anda mungkin ingin menggunakan ArrayList
secara langsung, atau menggunakan arrayListOf
fungsi pabrik ( ArrayList
analog -specific to mutableListOf
).
mutableListOf<T>()
adalah pemanggilan fungsi sebaris yang mengembalikan a
MutableList<T>
. Pada hari ini, mutableListOf
tidak mengembalikan instance ArrayList
.
ArrayList<String>()
adalah pemanggilan konstruktor dan tidak bisa sebaris.
Dengan kata lain, diberikan:
val a = mutableListOf<String>()
val b = ArrayList<String>()
a
adalah tipe MutableList<String>
b
adalah tipe ArrayList<String>
Saat runtime, keduanya a
dan b
akan menyimpan instance ArrayList
.
Perhatikan bahwa penyebarisan sangat berguna jika dikombinasikan dengan reifikasi tipe , yang membenarkan keberadaan listOf
, mutableListOf
dan sejenisnya.
a
dan b
memiliki tipe yang dideklarasikan berbeda - jadi ada perbedaan pada waktu kompilasi.
val b = arrayListOf<String>()
Seperti yang Anda lihat di sumber :
public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()
Jadi, tidak ada perbedaan, hanya metode kenyamanan.
mutableListOf
jugaArrayList
ada kata kunci di Kotlin