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 HashMapdari 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 Setdan 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 Integerdengan nilai 10. (Dan sama untuk 42). Kemudian yang Integerdilemparkan ke dalam Setyang dikenal dengan Integers. Mencoba memasukkan Stringakan menyebabkan kesalahan kompilasi.
Selanjutnya, for-each loop mengambil ketiga dari itu:
for (int i : set) {
total += i;
}
Pertama, s yang Setberisi Integerdigunakan dalam for-each loop. Setiap elemen dideklarasikan sebagai sebuah intdan yang diizinkan saat Integerdikembalikan ke kotak primitif int. Dan fakta bahwa unboxing ini terjadi diketahui karena obat generik digunakan untuk menentukan bahwa ada yang Integerdisimpan 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 Setcontoh 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 Objectadalah apa yang sedang adddiedit ke dalam himpunan.
set.add(10);
set.add(42);
Di baris di atas, autoboxing dalam bermain - primitif intnilai 10dan 42sedang autoboxed menjadi Integerobjek, yang sedang ditambahkan ke Set. Namun, perlu diingat, Integerobjek ditangani sebagai Objects, karena tidak ada informasi tipe untuk membantu kompilator mengetahui tipe apa yang Setdiharapkan.
for (Object o : set) {
Ini adalah bagian yang sangat penting. Alasan for-each loop berfungsi adalah karena antarmuka Setmengimplementasikan Iterable, yang mengembalikan Iteratorinformasi with type, jika ada. (Iterator<T> , itu.)
Namun, karena tidak ada informasi tipe, Setkehendak mengembalikan Iteratoryang akan mengembalikan nilai dalam Setas Objects, dan itulah mengapa elemen yang diambil di untuk-setiap loop harus berjenisObject .
Sekarang setelah Objectdiambil dari Set, itu perlu dilemparkan ke Integermanual untuk melakukan penambahan:
total += (Integer)o;
Di sini, typecast dilakukan dari sebuah Objectke 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 ClassCastExceptionmenunggu untuk terjadi, tetapi saya ngelantur ...)
The Integerkini unboxed menjadi intdan memungkinkan untuk melakukan penambahan ke dalam intvariabel 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.