200 likes | 535 Views
KELAS GENERIK. Sasaran. Diakhir perkuliahan diharapkan mahasiswa dapat mampu: Memahami konsep generik ( generic ) Menggunakan beberapa kelas generik dalam bahasa pemrograman Java ( Collection API ) Membuat implementasi kelas generik. Pengertian.
E N D
Sasaran Diakhir perkuliahan diharapkan mahasiswa dapat mampu: • Memahami konsep generik (generic) • Menggunakan beberapa kelas generik dalam bahasa pemrograman Java (Collection API) • Membuat implementasi kelas generik
Pengertian • Generic programming adalah salah satu cara pembuatan class dan method yang dapat digunakan untuk semua jenis tipe data, sehingga penggunaannya lebih fleksibel dan tidak kaku terhadap satu jenis tipe data saja, dimana dalam hal ini java adalah salah satu bahasa pemrograman yang sudah mensupportnya. • Contoh apabila terdapat metode void print(int a), hanya akan bekerja pada tipe data integer. Bila dibutuhkan metode tersebut untuk tipe data String, float, char atau bahkan references type, maka apakah perlu membuat metode serupa untuk beberapa tipe data berbeda. Tentu saja tidak diperlukan, karena dengan generic programming hanaya dengan menggunakan sebuah metode dapat dipergunakan untuk berbagai macam tipe data.
Pengertian (lanjutan) • Perhatikan Contoh Program berikut:
Pengertian (lanjutan) • Singkatnya, pemrograman generik memungkinkan tipe data (kelas dan interface) menjadi parameter ketika mendefinisikan kelas, interface dan metode. Sama seperti parameter formal yang digunakan dalam deklarasi metode, tipe parameter menyediakan cara untuk kembali menggunakan metode yang sama dengan input yang berbeda. Perbedaannya adalah bahwa masukan untuk parameter formal adalah nilai data, sedangkan input untuk tipe parameter adalah tipe data.
Manfaat Pemrograman Generik • Pemeriksaan tipe data lebih kuat/baik di saat kompilasi. • Kompiler Java melakukan pemeriksaan tipe data lebih ketat pada kode program generik. Memperbaiki kesalahan saat kompilasi lebih mudah daripada memperbaiki kesalahan saat runtime, karena lebih sulit menemukan kesalahan. • Dapat menghilangkan penulisan casting. • Potongan kode berikut berikut tanpa menggunakan pemrograman generik memerlukan casting: • Ditulis ulang menggunakan pemrograman generik, kode tidak memerlukan casting sbb.: List list = new ArrayList(); list.add("hello"); String s = (String) list.get(0); List<String> list = new ArrayList<String>(); list.add("hello"); String s = list.get(0); // no cast
Manfaat Pemrograman Generik • Memungkinkan programmer untuk mengimplementasikan algoritma generik. • Dengan algoritma generik yang bekerja pada koleksi berbagai tipe data, dapat disesuaikan, dan merupakan tipe yang aman dan lebih mudah dibaca. Dapat menghilangkan penulisan casting.
Tipe Generik • Sebuah tipe generik adalah kelas atau interface generik yang dipergunakan sebagai parameter untuk berbagai tipe data. • Kelas Box berikut akan dimodifikasi untuk memperlihatkan konsep tentang tipe generik. public class Box { private Object object; public void set(Object object) { this.object = object; } public Object get() { return object; } } public class Box<T> { // T stands for "Type" private T t; public void set(T t) { this.t = t; } public T get() { return t; } }
Deklarasi Kelas Generik • Sebuah kelas generik didefinisikan dengan format sebagai berikut: class nama<T1, T2, ..., Tn> { /* ... */ } • Bagian tipe parameter dibatasi oleh kurung sudut (<>), mengikuti nama kelas. Ini menentukan jenis parameter (juga disebut tipe variabel) T1, T2, ..., dan Tn. • Semua Obyek digantikan oleh T. Tipe variabel dapat berupa tipe data non-primitif, seperti: kelas, interface, array, atau bahkan tipe variabel lain. • Teknik yang sama dapat diterapkan pada interface generik.
Konvensi Penamaan Tipe Parameter • Konvensi penamaan tipe parameter generik adalah menggunakan huruf besar tunggal. Bertolak belakang dengan konvensi penamaan variabel. Tanpa penggunaan konvensi ini, akan sulit untuk membedakan antara tipe generik dan non-generik. • Penamaan tipe parameter yang paling sering digunakan adalah: • E - Element (digunakan secara luas oleh framework Collections dari Java) • K - Key • N - Number • T - Type • V - Value • S,U,V etc. - 2nd, 3rd, 4th types • Penamaan di atas digunakan di seluruh API Java SE.
Pemanggilan dan Instansiasi Tipe Generik • Mengacu pada kelas Box generik di atas, pemanggilan tipe generik, dapat dilakukan dengan cara menggantikan T dengan beberapa tipe yang konkret, seperti Integer, dsb. Box<Integer> integerBox; • pemanggilan tipe generik tampak mirip dengan pemanggilan metode biasa, tapi bukan melalui pengiriman argumen pada sebuah metode, melainkan mengirimkan tipe argumen. Pada kelas Box di atas berupa tipe kelas Integer. • Terminologi Tipe Parameter dan Tipe Argumen: “tipe parameter" dan "tipe argumen" seringkali dianggap sama, padahal sebenarnya tidak sama. • T di Foo <T> adalah tipe parameter • String di Foo <String> f adalah tipe argumen.
Pemanggilan dan Instansiasi Tipe Generik • Seperti pada deklarasi variabel lain, kode program di atas tidak benar-benar membuat objek Box baru. Ini hanya menyatakan bahwa integerBox akan memegang referensi ke sebuah "Box of Integer", yang menyatakan bagaimana Box <Integer> dibaca. • Pemanggilan sebuah tipe generik umumnya disebut sebagai tipe parameter. • Untuk instantiasi kelas ini, gunakan kata kunci new, kemudian tempatkan <Integer> antara nama kelas dan tanda kurung: Box<Integer> integerBox = new Box<Integer>();
Multiple Type Parameters • Kelas generik dapat memiliki beberapa tipe parameter. Sebagai contoh, kelas OrderedPair generik berikut, yang meng implementasikan interface Pair generik: public interface Pair<K, V> { public K getKey(); public V getValue(); } public class OrderedPair<K, V> implements Pair<K, V> { private K key; private V value; public OrderedPair(K key, V value) { this.key = key; this.value = value; } public K getKey() { return key; } public V getValue() { return value; } }
Multiple Type Parameters • Pernyataan berikut membuat dua instansiasi dari kelas OrderedPair: • Pernyataannew OrderedPair<String, Integer>, menginstansiasi K sebagai sebuahString and V sebagai sebuahInteger. Karena itu, tipe parameter dari konstruktor OrderedPair adalah String dan Integer. • Pembuatan interfacegenerik, mengikuti konvensi yang sama seperti pada pembuatan kelasgenerik. • Pair<String, Integer> p1 = new OrderedPair<String, Integer>("Even", 8); • Pair<String, String> p2 = new OrderedPair<String, String>("hello", "world");
OrderedPair<String, Box<Integer>> p = new OrderedPair<>("primes", new Box<Integer>(...)); OrderedPair<String, Box<Integer>> p = new OrderedPair<>("primes", new Box<Integer>(...)); OrderedPair<String, Box<Integer>> p = new OrderedPair<>("primes", new Box<Integer>(...)); Multiple Type Parameters • Tipe parameter (seperti, K atau V) dapat disubsitusi dengan tipe parameter (seperti, List<String>). Misalnya, dengan menggunakan contoh pada OrderedPair <K, V>: OrderedPair<String, Box<Integer>> p = new OrderedPair<>("primes", new Box<Integer>(...))
OrderedPair<String, Box<Integer>> p = new OrderedPair<>("primes", new Box<Integer>(...)); OrderedPair<String, Box<Integer>> p = new OrderedPair<>("primes", new Box<Integer>(...)); OrderedPair<String, Box<Integer>> p = new OrderedPair<>("primes", new Box<Integer>(...)); Raw Types • Raw types banyak muncul dalam kode pewarisan karena banyak kelas API (seperti kelas Collection) bukan kelas generik sebelum JDK 5.0. Bila menggunakan raw types, pada dasarnya akan mendapatkan perilaku pra-generik – Box memberikan banyak Objek. Untuk kompatibilitas, menetapkan tipe parameter untuk raw type diperbolehkan. Box<String> stringBox = new Box<>(); Box rawBox = stringBox; // OK • Tetapi jika anda menetapkan raw type pada tipe parameter, maka akan mendapatkan peringatan: Box rawBox = new Box(); // rawBox is a raw type of Box<T> Box<Integer> intBox = rawBox; // warning: unchecked conversion
OrderedPair<String, Box<Integer>> p = new OrderedPair<>("primes", new Box<Integer>(...)); OrderedPair<String, Box<Integer>> p = new OrderedPair<>("primes", new Box<Integer>(...)); OrderedPair<String, Box<Integer>> p = new OrderedPair<>("primes", new Box<Integer>(...)); Raw Types • Peringatan juga akan diberikan jika menggunakan raw type untuk memanggil metode generik yang didefinisikan dalam tipe generik yang sesuai: Box<String> stringBox = new Box<>(); Box rawBox = stringBox; rawBox.set(8); // warning: unchecked invocation // to set(T) • Peringatan tersebut menunjukkan bahwa raw type mengabaikan pemeriksaan tipe generik, akan terjadi penundaaan penangkapan kesalahan kode saat runtime. Oleh karena itu, harus dihindari menggunakan raw types.