Daftar parameter variabel java
Salinan kode adalah sebagai berikut:
kelas A {}
Karena semua kelas diwarisi dari objek, Anda dapat menggunakan array objek sebagai parameter:
parameter kelas publik {static void printArray (objek [] args) {for (objek obj: args) {system.out.print (obj + ""); } System.out.println (); } public static void main (string [] args) {printArray (objek baru [] {new integer (47), float baru (3.14), double baru (11.11)}); printarray (objek baru [] {"satu", "dua", "di sana"}); printarray (objek baru [] {baru a (), a baru (), a a ()}} baru); }} Untuk versi Java SE5 setelah menambahkan fitur, Anda dapat menulis ini:
Parameter kelas publik {public static void printArray (objek ... args) {for (objek obj: args) {System.out.print (obj + ""); } System.out.println (); } public static void main (string [] args) {printArray (integer baru (47), float baru (3.14), double baru (11.11)); printarray (47, 3.14f, 11.11); printarray ("satu", "dua", "tiga"); printarray (a baru (), a () baru, a a ()); printarray ((objek []) integer baru [] {1, 2, 3, 4}); printarray (); }} Anda dapat menggunakan objek untuk memikirkan daftar parameter:
kelas publik varArgType {static void f (karakter ... args) {system.out.print (args.getClass ()); System.out.println ("Panjang" + args.length); } static void g (int ... args) {System.out.print (args.getClass ()); System.out.println ("Panjang" + args.length); } public static void main (string [] args) {f ('a'); F(); g (1); G(); System.out.println ("int []" + int baru [0] .getClass ()); }}Ini adalah fitur yang diperkenalkan di Java 5. Jika jumlah parameter yang ingin diterima metode tidak pasti, maka fitur ini bisa berguna.
Misalnya, di mana operasi IO terlibat, Anda pada dasarnya perlu menutup setidaknya dua aliran: input dan output. Saya suka merangkum operasi penutupan aliran ke dalam metode berikut, sehingga beberapa aliran dapat ditutup hanya dalam satu panggilan.
public static void closeSilent (closeable ... closeables) {for (closeable closeable: closeAbles) {if (closeable! = null) {coba {closeable.close (); } catch (ioException diabaikan) {}}}}Ini adalah satu -satunya tempat saya pikir fitur ini cocok untuk digunakan, dengan fitur -fitur berikut:
Parameter ini memiliki tipe yang sama;
Jumlah parameter tidak pasti, masing -masing opsional;
Penggunaan parameter ini adalah sama, misalnya, di atas semuanya ditutup.
Daftar parameter panjang variabel java hanya dapat ditempatkan di akhir daftar parameter metode.
Implementasi Daftar Parameter Panjang Java
Implementasi daftar parameter panjang variabel Java dilewatkan melalui kompiler untuk merangkum parameter ini ke dalam array.
Misalnya, tanda tangan dari metode di atas sebenarnya: dekat (closeable [] closeables) batal.
Menginjak lubang
Ada metode yang disebut oleh A dan B di dua tempat. Pada bulan September, parameter perlu ditambahkan ke A. Ketika pikiran saya gila, saya memutuskan untuk menggunakan daftar parameter panjang variabel. Saya merasa tidak perlu mengubahnya menjadi B, jadi lubang itu terkubur.
Baru -baru ini, kami telah meminta B untuk menambahkan dua parameter baru di sini, jadi kami terus menambahkan parameter ke daftar parameter metode. Jenis parameter ini berbeda, sehingga daftar parameter panjang variabel dinyatakan sebagai tipe objek.
Lubang pertama adalah bahwa ketika mengambil elemen dengan parameter panjang variabel dalam metode ini, tidak memperhitungkan bahwa beberapa parameter tidak dilewati, dan array merupakan pengecualian offside dihancurkan secara langsung. Saya segera merasa bahwa daftar parameter panjang variabel tidak baik, jadi saya tidak membutuhkannya, dan mengubahnya menjadi parameter formulir tetap biasa.
Setelah modifikasi, tidak apa -apa untuk mengujinya di lingkungan pengujian. Setelah mengganti beberapa kelas di lingkungan produksi, hasilnya adalah kesalahan. Metode tidak dapat ditemukan. Itu tergantung pada tanda tangan metode, tetapi itu adalah array, dan belum diganti. Menilai dari kode sumber, lokasi panggilan tidak perlu diubah, jadi saya tidak berharap untuk menggantinya; Karena lingkungan pengujian sepenuhnya dikemas, tidak akan ada masalah.
Tanda tangan metode ini ditentukan pada saat kompilasi. Level kode sumber tampaknya tidak memerlukan modifikasi, tetapi tidak berarti bahwa kelas yang dikompilasi tidak perlu diganti.
Bahkan, saya telah mendengar sebelumnya bahwa dalam hal ini paket tidak teratur, setelah mengubah nilai konstan dalam kode sumber, hanya file kelas yang menentukan konstanta diganti, dan tidak ada kompilasi ulang dan mengganti semua file kelas yang merujuk konstanta ini dimungkinkan, menghasilkan masalah yang tidak dapat dijelaskan. Ini pada dasarnya adalah masalah yang sama dengan tanda tangan metode.