Sabtu, 22 Mei 2010

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 berupa Object apa saja. Beberapa koleksi bisa berisi nilai null, sementara yang lain tidak. Misalnya menambahkan objek ke dalam Set 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 koleksi kol. Parameternya bisa berupa Collection apa saja.
* kol.addAll(col2) -- menambahkan semua objek yang ada dalam koleksi kol2 ke dalam kol
* kol.removeAll(kol2) -- menghapus semua objek di kol yang ada pada kol2
* kol.retainAll(kol2) -- menghapus semua objek pada kol yang tidak ada pada kol2. Hanya akan mempertahankan objek yang ada pada kol2
* 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 dalam kol bertipe String, maka (String[])kol.toArray() akan mengembalikan array String yang berisi semua string di dalam koleksi.

Karena semua metode adalah turunan dari interface 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.

Tidak ada komentar:

Posting Komentar