Pemrograman Generik pada Java
Seperti pada C++, Java adalah bahasa bertipe kuat. Akan tetapi, pemrograman generik pada Java lebih dekat dengan Smalltalk daripada C++. Seperti telah dijelaskan sebelumnya, pemrograman generik pada Java berdasarkan pada kelas
Object
yang merupakan kelas super dari semua kelas. Hingga tingkat tertentu, ini membuat Java mirip dengan Smalltalk : Struktur data yang didesain untuk menampung Object
bisa digunakan untuk menyimpan data kelas apapun. Kita tidak perlu membuat template atau fitur pada bahasa pemrograman lain untuk mendukung pemrograman generik.Tentunya, tipe primitif, seperti integer, bukan objek pada Java, dan karenanya tidak bisa disimpan dalam tipe data generik. Dan sebenarnya, tidak ada cara untuk melakukan pemrograman generik dengan tipe data primitif pada Java. Pendekatan Smalltalk tidak bisa diterapkan pada Java kecuali untuk objek, dan pendekatan C++ tidak tersedia pada Java.
Lebih jauh, subrutin generik lebih bermasalah pada Java daripada Smalltalk atau C++. Pada Smalltak, subrutin dapat dipanggil dengan parameter bertipe apapun, dan akan bekerja asalkan operator yang digunakan pada subrutin didefinisikan pada parameternya.
Pada Java, parameter suatu subrutin harus bertipe tertentu. Dan subrutin hanya bisa menggunakan operasi untuk tipe itu saja. Subrutin dengan parameter
Object
bisa digunakan untuk objek tipe apa saja, akan tetapi subrutin hanya bisa menggunakan operasi pada kelas Object
saja, dan sebenarnya hanya sedikit operasi pada kelas Object
! Misalnya tidak ada operasi pembanding pada kelas Object
, jadi kita tidak bisa membuat algoritma pengurutan generik. Kita akan lihat bagaimana Java menyelesaikan masalah ini.Karena masalah seperti ini, beberapa orang menyatakan bahwa Java tidak mendukung pemrograman generik secara keseluruhan. Beberapa orang lain tidak setuju. Akan tetapi, tetap saja ini tidak menghambat Java untuk digunakan secara luas.
Algoritma Generik
Interface
Collection
memiliki metode untuk melakukan beberapa operasi dasar pada koleksi. Karena "koleksi" adalah konsep yang sangat umum, maka operasi yang bisa dilakukan oleh semua koleksi juga sesuatu yang sangat umum. Misalnyakol
adalah objek yang mengimplementasi interface Collection
. Berikut ini adalah operasi yang bisa dilakukan.- kol.size() -- mengembalikan int yang berisi banyaknya objek dalam suatu koleksi
- kol.isEmpty() -- mengembalikan boolean true jika koleksi kosong, atau ukurannya sama dengan 0
- kol.clear() -- menghapus semua objek dalam koleksi
- kol.contains(objek) -- mengembalikan nilai boolean jika
objek
ada dalam koleksi - kol.add(objek) -- menambah
objek
ke dalam koleksi. Parameternya bisa berupaObject
apa saja. Beberapa koleksi bisa berisi nilainull
, sementara yang lain tidak. Misalnya menambahkan objek ke dalamSet
tidak berpengaruh apa-apa jika objek tersebut sudah ada di dalamnya. - kol.remove(objek) -- membuang objek dari dalam koleksi, jika ada, dan mengembalikan nilai boolean yang menyatakan apakah objek tersebut ada atau tidak di dalam koleksi
- kol.containsAll(kol2) -- mengembalikan nilai boolean jika semua objek dalam
kol2
ada di dalam koleksikol
. Parameternya bisa berupaCollection
apa saja. - kol.addAll(col2) -- menambahkan semua objek yang ada dalam koleksi
kol2
ke dalamkol
- kol.removeAll(kol2) -- menghapus semua objek di
kol
yang ada padakol2
- kol.retainAll(kol2) -- menghapus semua objek pada
kol
yang tidak ada padakol2
. Hanya akan mempertahankan objek yang ada padakol2
- kol.toArray() -- mengembalikan array bertipe
Object[]
yang isinya semua item di dalam koleksi. Nilai yang dikembalikan bisa di-tipe cast ke dalam tipe array lain, jika perlu. Misalnya, jika kita tahu bahwa semua item di dalamkol
bertipeString
, maka(String[])kol.toArray()
akan mengembalikan arrayString
yang berisi semua string di dalam koleksi.
Collection
, maka metode ini harus didefinisikan pada semua objek yang mengimplementasikan interface ini. Akan tetapi ada masalah yang timbul. Misalnya ukuran suatu Collection
tidak bisa diganti setelah dibuat. Metode yang menambah atau membuang objek tidak bisa digunakan untuk koleksi jenis ini. Meskipun mungkin legal untuk memanggil metode ini, pengecualian akan dilemparkan ketika program dijalankan. Jenis pengecualiannya bernama UnsupportedOperationException
.Ada juga masalah efisiensi. Meskipun suatu operasi didefinisikan untuk beberapa jenis koleksi, tentunya unjuk kerjanya tidak sama untuk semua kelas. Bahkan untuk metode sesederhana
size()
bisa sangat berbeda dari satu jenis koleksi ke jenis koleksi lainnya.Untuk beberapa jenis koleksi, waktu pengolahan sebanding dengan jumlah item di dalam koleksi. Koleksi lain mungkin memiliki variabel instansi yang melacak jumlah item di dalam koleksi, sehingga menjalankan
size()
sama dengan mengambil nilai variabel instansi ini. Artinya operasinya hanya dilakukan satu langkah saja, tidak peduli berapa banyak item yang ada di dalam koleksi.Ketika kita menggunakan koleksi, alangkah lebih baiknya untuk mengetahui seberapa efisien suatu operasi dilakukan untuk jenis koleksi tertentu. Kita harus bisa memilih koleksi yang cocok untuk masalah yang kita hadapi. Kita akan lihat lebih detail di bagian berikutnya.
0 Komentar:
Posting Komentar
Berlangganan Posting Komentar [Atom]
<< Beranda