Apakah ada perbedaan preferensi atau perilaku antara menggunakan:
if(obj.getClass().isArray()) {}
dan
if(obj instanceof Object[]) {}
?
sumber
Apakah ada perbedaan preferensi atau perilaku antara menggunakan:
if(obj.getClass().isArray()) {}
dan
if(obj instanceof Object[]) {}
?
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[]
hasilfalse
ketika Anda menetapkanint[]
untukobj
, Anda keliru.obj instanceof Object[]
menghasilkanfalse
jikaObject obj = new int[7]
.java.lang.Object
, sehingga masuk akal. Tetapiinstanceof
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.Dalam kasus terakhir, jika obj adalah nol, Anda tidak akan mendapatkan NullPointerException tetapi false.
sumber
Jika
obj
bertipeint[]
say, maka itu akan memiliki arrayClass
tetapi tidak menjadi turunan dariObject[]
. Jadi apa yang ingin Anda lakukanobj
. Jika Anda akan melemparkannya, ikutiinstanceof
. Jika Anda akan menggunakan refleksi, gunakan.getClass().isArray()
.sumber
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.sumber
Baru-baru ini saya mengalami masalah dalam memutakhirkan aplikasi Groovy dari JDK 5 ke JDK 6. Penggunaan
isArray()
gagal di JDK6:Mengubah untuk
instanceof Object[]
memperbaiki ini.sumber
isArray
adalah metodeClass
, tidakType
, jadi tentu sajaGenericArrayTypeImpl
tidak memiliki metode itu. DangetClass
tidak pernah dapat mengembalikan non-Class
Type
, jadi Anda (atau Groovy ??) pasti telah melakukan kesalahan untuk mendapatkan ini, seperti menganggap setiapType
is aClass
.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/
sumber
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.
sumber
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.sumber