Apakah ada perbedaan preferensi atau perilaku antara menggunakan:
if(obj.getClass().isArray()) {}
dan
if(obj instanceof Object[]) {}
?
Apakah ada perbedaan preferensi atau perilaku antara menggunakan:
if(obj.getClass().isArray()) {}
dan
if(obj instanceof Object[]) {}
?
Jawaban:
Dalam kebanyakan kasus, Anda harus menggunakan instanceof
operator untuk menguji apakah suatu objek adalah sebuah array.
Secara umum, Anda menguji jenis objek sebelum menurunkan ke jenis tertentu yang dikenal pada waktu kompilasi. Sebagai contoh, mungkin Anda menulis beberapa kode yang dapat bekerja dengan a Integer[]
atau a int[]
. Anda ingin menjaga gips Anda dengan instanceof
:
if (obj instanceof Integer[]) {
Integer[] array = (Integer[]) obj;
/* Use the boxed array */
} else if (obj instanceof int[]) {
int[] array = (int[]) obj;
/* Use the primitive array */
} else ...
Pada tingkat JVM, instanceof
operator menerjemahkan ke kode byte "instanceof" tertentu , yang dioptimalkan di sebagian besar implementasi JVM.
Dalam kasus yang lebih jarang, Anda mungkin menggunakan refleksi untuk menelusuri grafik objek dari tipe yang tidak dikenal. Dalam kasus seperti ini, isArray()
metode ini dapat membantu karena Anda tidak tahu tipe komponen pada waktu kompilasi; Anda mungkin, misalnya, menerapkan semacam mekanisme serialisasi dan dapat meneruskan setiap komponen array ke metode serialisasi yang sama, apa pun jenisnya.
Ada dua kasus khusus: referensi nol dan referensi ke array primitif.
Referensi nol akan menyebabkan instanceof
hasil false
, sedangkan isArray
lemparan a NullPointerException
.
Diterapkan ke array primitif, instanceof
hasil false
kecuali jenis komponen pada operan kanan sama persis dengan jenis komponen. Sebaliknya, isArray()
akan kembali true
untuk semua jenis komponen.
obj instanceof int[]
hasil false
ketika Anda menetapkan int[]
untuk obj
, Anda keliru.
obj instanceof Object[]
menghasilkan false
jika Object obj = new int[7]
.
java.lang.Object
, sehingga masuk akal. Tetapi instanceof
masih bisa digunakan untuk menguji array primitif.
isArray()
harus digunakan. Dalam kasus khusus yang sangat tidak umum hanya memiliki array objek, instanceof
memberikan alternatif kinerja tinggi.
Jika obj
bertipe int[]
say, maka itu akan memiliki array Class
tetapi tidak menjadi turunan dari Object[]
. Jadi apa yang ingin Anda lakukan obj
. Jika Anda akan melemparkannya, ikuti instanceof
. Jika Anda akan menggunakan refleksi, gunakan .getClass().isArray()
.
getClass().isArray()
secara signifikan lebih lambat di Sun Java 5 atau 6 JRE daripada di IBM.
Begitu banyak menggunakan clazz.getName().charAt(0) == '['
itu lebih cepat di Sun JVM.
Baru-baru ini saya mengalami masalah dalam memutakhirkan aplikasi Groovy dari JDK 5 ke JDK 6. Penggunaan isArray()
gagal di JDK6:
MissingMethodException:
No signature of sun.reflect.generics.reflectiveObjects.GenericArrayTypeImpl.isArray() ...
Mengubah untuk instanceof Object[]
memperbaiki ini.
isArray
adalah metode Class
, tidak Type
, jadi tentu saja GenericArrayTypeImpl
tidak memiliki metode itu. Dan getClass
tidak pernah dapat mengembalikan non- Class
Type
, jadi Anda (atau Groovy ??) pasti telah melakukan kesalahan untuk mendapatkan ini, seperti menganggap setiap Type
is a Class
.
Refleksi array Java adalah untuk kasus-kasus di mana Anda tidak memiliki instance Kelas yang tersedia untuk melakukan "instanceof" pada. Misalnya, jika Anda menulis semacam kerangka injeksi, yang menyuntikkan nilai ke instance kelas baru, seperti yang dilakukan JPA, maka Anda perlu menggunakan fungsionalitas isArray ().
Saya menulis blog tentang ini pada awal Desember. http://blog.adamsbros.org/2010/12/08/java-array-reflection/
Jika Anda pernah memiliki pilihan antara solusi reflektif dan solusi non-reflektif, jangan pernah memilih yang reflektif (melibatkan objek Class). Bukannya itu "salah" atau apa pun, tetapi apa pun yang melibatkan refleksi umumnya kurang jelas dan kurang jelas.
Tidak ada perbedaan dalam perilaku yang saya dapat temukan di antara keduanya (selain dari null-case yang jelas). Mengenai versi mana yang lebih disukai, saya akan memilih yang kedua. Ini adalah cara standar untuk melakukan ini di Jawa.
Jika itu membingungkan pembaca kode Anda (karena String[] instanceof Object[]
itu benar), Anda mungkin ingin menggunakan yang pertama untuk lebih eksplisit jika pengulas kode terus bertanya tentang hal itu.