Tidak perlu typecast adalah salah satu keuntungan terbesar dari generik Java , karena ia akan melakukan pemeriksaan jenis pada waktu kompilasi. Ini akan mengurangi kemungkinanClassCastException
yang dapat dilemparkan saat runtime, dan dapat menghasilkan kode yang lebih kuat.
Tetapi saya curiga Anda sepenuhnya menyadarinya.
Setiap kali saya melihat Generik, itu membuat saya pusing. Saya menemukan bagian terbaik dari Java adalah kesederhanaannya dan sintaksis minimal dan generik tidak sederhana dan menambahkan sejumlah besar sintaks baru.
Pada awalnya, saya juga tidak melihat manfaat obat generik. Saya mulai belajar Java dari sintaks 1.4 (meskipun Java 5 keluar pada saat itu) dan ketika saya menemukan generik, saya merasa lebih banyak kode untuk ditulis, dan saya benar-benar tidak mengerti manfaatnya.
IDE modern membuat penulisan kode dengan generik lebih mudah.
IDE yang paling modern dan layak cukup pintar untuk membantu menulis kode dengan obat generik, terutama dengan penyelesaian kode.
Berikut contoh pembuatan Map<String, Integer>
dengan a HashMap
. Kode yang harus saya ketik adalah:
Map<String, Integer> m = new HashMap<String, Integer>();
Dan memang, banyak sekali mengetik hanya untuk membuat yang baru HashMap
. Namun, pada kenyataannya, saya hanya perlu mengetik sebanyak ini sebelum Eclipse tahu apa yang saya butuhkan:
Map<String, Integer> m = new Ha
Ctrl+Space
Benar, saya memang perlu memilih HashMap
dari daftar kandidat, tetapi pada dasarnya IDE tahu apa yang harus ditambahkan, termasuk tipe generik. Dengan alat yang tepat, menggunakan obat generik tidak terlalu buruk.
Selain itu, karena jenisnya diketahui, saat mengambil elemen dari koleksi generik, IDE akan bertindak seolah-olah objek tersebut sudah menjadi objek dari jenis yang dideklarasikan - tidak perlu melakukan casting agar IDE mengetahui jenis objek tersebut. adalah.
Keuntungan utama dari obat generik berasal dari cara kerjanya yang baik dengan fitur Java 5 yang baru. Berikut adalah contoh melempar bilangan bulat ke a Set
dan menghitung totalnya:
Set<Integer> set = new HashSet<Integer>();
set.add(10);
set.add(42);
int total = 0;
for (int i : set) {
total += i;
}
Dalam potongan kode itu, ada tiga fitur Java 5 baru yang ada:
Pertama, generik dan autoboxing primitif memungkinkan baris berikut:
set.add(10);
set.add(42);
Integer di 10
-autobox menjadi sebuah Integer
dengan nilai 10
. (Dan sama untuk 42
). Kemudian yang Integer
dilemparkan ke dalam Set
yang dikenal dengan Integer
s. Mencoba memasukkan String
akan menyebabkan kesalahan kompilasi.
Selanjutnya, for-each loop mengambil ketiga dari itu:
for (int i : set) {
total += i;
}
Pertama, s yang Set
berisi Integer
digunakan dalam for-each loop. Setiap elemen dideklarasikan sebagai sebuah int
dan yang diizinkan saat Integer
dikembalikan ke kotak primitif int
. Dan fakta bahwa unboxing ini terjadi diketahui karena obat generik digunakan untuk menentukan bahwa ada yang Integer
disimpan di fileSet
.
Generik bisa menjadi perekat yang menyatukan fitur-fitur baru yang diperkenalkan di Java 5, dan itu membuat pengkodean lebih sederhana dan lebih aman. Dan sebagian besar waktu IDE cukup pintar untuk membantu Anda dengan saran yang bagus, jadi umumnya, itu tidak akan lebih banyak mengetik.
Dan terus terang, seperti yang bisa dilihat dari Set
contoh, saya merasa bahwa memanfaatkan fitur Java 5 dapat membuat kode lebih ringkas dan kuat.
Edit - Contoh tanpa obat generik
Berikut adalah ilustrasi Set
contoh di atas tanpa menggunakan obat generik. Itu mungkin, tetapi tidak terlalu menyenangkan:
Set set = new HashSet();
set.add(10);
set.add(42);
int total = 0;
for (Object o : set) {
total += (Integer)o;
}
(Catatan: Kode di atas akan menghasilkan peringatan konversi yang tidak dicentang pada waktu kompilasi.)
Saat menggunakan koleksi non-generik, tipe yang dimasukkan ke dalam koleksi adalah tipe objek Object
. Oleh karena itu, dalam contoh ini, a Object
adalah apa yang sedang add
diedit ke dalam himpunan.
set.add(10);
set.add(42);
Di baris di atas, autoboxing dalam bermain - primitif int
nilai 10
dan 42
sedang autoboxed menjadi Integer
objek, yang sedang ditambahkan ke Set
. Namun, perlu diingat, Integer
objek ditangani sebagai Object
s, karena tidak ada informasi tipe untuk membantu kompilator mengetahui tipe apa yang Set
diharapkan.
for (Object o : set) {
Ini adalah bagian yang sangat penting. Alasan for-each loop berfungsi adalah karena antarmuka Set
mengimplementasikan Iterable
, yang mengembalikan Iterator
informasi with type, jika ada. (Iterator<T>
, itu.)
Namun, karena tidak ada informasi tipe, Set
kehendak mengembalikan Iterator
yang akan mengembalikan nilai dalam Set
as Object
s, dan itulah mengapa elemen yang diambil di untuk-setiap loop harus berjenisObject
.
Sekarang setelah Object
diambil dari Set
, itu perlu dilemparkan ke Integer
manual untuk melakukan penambahan:
total += (Integer)o;
Di sini, typecast dilakukan dari sebuah Object
ke Integer
. Dalam hal ini, kami tahu ini akan selalu berfungsi, tetapi typecasting manual selalu membuat saya merasa ini adalah kode yang rapuh yang dapat rusak jika perubahan kecil dilakukan di tempat lain. (Saya merasa bahwa setiap typecast ClassCastException
menunggu untuk terjadi, tetapi saya ngelantur ...)
The Integer
kini unboxed menjadi int
dan memungkinkan untuk melakukan penambahan ke dalam int
variabel total
.
Saya harap saya dapat mengilustrasikan bahwa fitur baru Java 5 dapat digunakan dengan kode non-generik, tetapi tidak sebersih dan langsung menulis kode dengan obat generik. Dan, menurut pendapat saya, untuk memanfaatkan sepenuhnya fitur-fitur baru di Java 5, kita harus melihat ke generik, jika paling tidak, memungkinkan pemeriksaan waktu kompilasi untuk mencegah typecast yang tidak valid membuang pengecualian saat runtime.