Tidak mutableListOfjuga ArrayListada kata kunci di Kotlin
Ilya
Jawaban:
150
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 mutableListOfakan menghasilkan ArrayList, dan tidak ada perbedaan dalam perilaku: setelah daftar dibuat, semuanya akan berperilaku sama.
Sekarang, katakanlah versi Kotlin yang akan datang berubah mutableListOfuntuk 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. mutableListOfkemudian akan meminta Anda menggunakan penerapan daftar baru tersebut secara transparan, dan Anda akan mendapatkan perilaku yang lebih baik secara gratis. Pergi dengan mutableListOfjika itu terdengar seperti kasus Anda.
Di sisi lain, mungkin Anda menghabiskan banyak waktu berpikir tentang masalah Anda, dan berpikir bahwa ArrayListbenar-benar adalah cocok untuk masalah Anda, dan Anda tidak ingin risiko mendapatkan pindah ke sesuatu yang sub-optimal. Kemudian Anda mungkin ingin menggunakan ArrayListsecara langsung, atau menggunakan arrayListOffungsi pabrik ( ArrayListanalog -specific to mutableListOf).
mutableListOf<T>()adalah pemanggilan fungsi sebaris yang mengembalikan a
MutableList<T>. Pada hari ini, mutableListOftidak mengembalikan instance ArrayList.
val a = mutableListOf<String>()
val b = ArrayList<String>()
a adalah tipe MutableList<String>
b adalah tipe ArrayList<String>
Saat runtime, keduanya adan bakan menyimpan instance ArrayList.
Perhatikan bahwa penyebarisan sangat berguna jika dikombinasikan dengan reifikasi tipe , yang membenarkan keberadaan listOf, mutableListOfdan sejenisnya.
Dan saya akan menempatkan "kenyamanan" dalam tanda kutip. Hingga MutableList benar-benar memiliki implementasi yang berbeda, menyediakan objek inti yang melakukan hal yang sama dengan objek inti lainnya akan membingungkan, dan sama sekali bukan kenyamanan. :(
Mike Williamson
@MikeWilliamson karena array-list adalah salah satu hal yang paling membingungkan adalah Java, bagi saya itu adalah array atau daftar tetapi keduanya? Kepalaku meledak. Saya menemukan mutable-list adalah nama yang sempurna untuk tipe bernama aneh.
mutableListOf
jugaArrayList
ada kata kunci di KotlinJawaban:
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, sebaliknyaval a = ArrayList()
, Anda mengatakan "Saya secara khusus menginginkanArrayList
".Dalam praktiknya, dalam implementasi kompilasi Kotlin ke JVM saat ini, pemanggilan
mutableListOf
akan menghasilkanArrayList
, 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 denganmutableListOf
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 menggunakanArrayList
secara langsung, atau menggunakanarrayListOf
fungsi pabrik (ArrayList
analog -specific tomutableListOf
).sumber
mutableListOf<T>()
adalah pemanggilan fungsi sebaris yang mengembalikan aMutableList<T>
. Pada hari ini,mutableListOf
tidak mengembalikan instanceArrayList
.ArrayList<String>()
adalah pemanggilan konstruktor dan tidak bisa sebaris.Dengan kata lain, diberikan:
val a = mutableListOf<String>() val b = ArrayList<String>()
a
adalah tipeMutableList<String>
b
adalah tipeArrayList<String>
Saat runtime, keduanya
a
danb
akan menyimpan instanceArrayList
.Perhatikan bahwa penyebarisan sangat berguna jika dikombinasikan dengan reifikasi tipe , yang membenarkan keberadaan
listOf
,mutableListOf
dan sejenisnya.sumber
a
danb
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.
sumber