Jika Anda menemukan bahwa ada metode definisi dalam antarmuka:
string publik [] getParameters ();
Maka Anda harus merenung dengan serius. Array tidak hanya kuno, tetapi kami memiliki alasan yang masuk akal untuk menghindari paparan. Dalam artikel ini, saya akan mencoba meringkas cacat array di Java API. Mulailah dengan salah satu contoh yang paling tidak terduga.
Array menyebabkan kinerja yang buruk
Anda mungkin berpikir bahwa penggunaan array adalah yang tercepat karena array adalah struktur data yang mendasarinya yang diimplementasikan oleh sebagian besar koleksi. Bagaimana penggunaan grup nomor murni lebih rendah daripada menggunakan objek array?
Mari kita mulai dengan penggunaan kebiasaan umum ini yang terlihat akrab:
String publik [] getNames () {return nameslist.toArray (string baru [nameslist.size ()]);} Metode ini membuat data dari koleksi variabel di mana data pelestarian internal digunakan lebih lambat (silakan lihat bilah hijau vs oranye di bagan):
string publik [] getNames () {return nameSlist.toArray (string baru [0]);} Namun, jika metode ini mengembalikan daftar, membuat salinan defensif lebih cepat (bilah merah):
Daftar Publik <String> getNames () {return new ArrayList (nameslist);} Perbedaannya adalah bahwa arraylist menempatkan item datanya dalam array objek [], dan menggunakan jenis metode ToArray, yang jauh lebih cepat dari jenis metode (Blue Bar) Tidak ada jenis array, enkapsulasi dienkapsulasi dalam jenis generik kompiler.
Ikon ini menunjukkan standar referensi untuk n = 5 pada Java 7. Namun, lebih banyak item data atau sistem situasi VM lainnya, gambar ini tidak akan berubah terlalu banyak. dikonversi menjadi koleksi untuk menggunakannya untuk melakukan apa pun, dan kemudian mengonversi hasilnya kembali ke array untuk mengirimkannya ke metode antarmuka lain, jadi dan sebagainya.
Ini menggunakan arraylist sederhana alih -alih array untuk meningkatkan kinerja byte.
Menggunakan koleksi, Anda bahkan dapat memutuskan untuk mengembalikan versi daftar internal yang tidak dimodifikasi:
Daftar Publik <String> getNames () {return collections.unmodifibleList (nameslist);}Operasi ini akan berjalan dengan harga pasar tetap, jadi ia jauh lebih cepat daripada metode lain (bar kuning). Tidak dapat memodifikasi perubahan akan berubah ketika data internal Anda berubah. Jika perubahan terjadi, klien berjalan ke ConcurrentModificationException ketika item data yang diulang. , Ini akan menjadi pilihan berkinerja tinggi beberapa hal yang tidak dapat diimplementasikan oleh array.
Array mendefinisikan struktur, bukan antarmuka
Java adalah bahasa yang berorientasi objek. Konsep inti dari objek -orientasi adalah untuk menyediakan beberapa metode untuk mengakses dan mengoperasikan data mereka alih -alih secara langsung mengoperasikan domain data.
Karena Java telah merancang kinerja, tipe asli dan array telah diintegrasikan ke dalam sistem tipe. Akses langsung, Anda tidak memiliki banyak hal lain yang harus dilakukan dalam array.
String [] array = {"foo", "bar"}; Println (array); //-> [ljava.lang.string;@6f548414 list.equals (arrays.aslist ("foo", "bar")) //-> truerray.equals (string baru [] {"fooo "," Bar "}) // -> falseBerbeda dari array, API koleksi menyediakan banyak metode yang berguna untuk mengakses elemen. dan mempertahankan prinsip implementasi pada saat yang sama.
Dengan menggunakan data, Anda menentukan di mana data disimpan dalam memori.
Array bukan jenis yang aman
Jika Anda mengandalkan jenis pemeriksaan kompiler, hati -hati dari array objek.
Number [] number = integer baru [10];
Alasannya adalah bahwa array adalah "kolaboratif". Meliputi semua teori, dan semua teori, setiap pengembang Java harus membaca.
Karena perilaku ini, antarmuka jenis array yang terbuka memungkinkan sub -tipe dari deklarasi jenis array, yang menyebabkan kelainan runtime yang aneh.
Bloch juga menjelaskan bahwa array tidak kompatibel dengan tipe generik.
-Joshua Block, Java Efektif (Edisi ke -2), Pasal 29
Meringkaskan
Struktur bahasa dari lapisan bawah array dan mereka akan digunakan dalam implementasi, tetapi mereka tidak boleh memikirkan paparan kelas lain. .