kelas generik

17
KELAS GENERIK

Upload: xaviera-lagunas

Post on 02-Jan-2016

142 views

Category:

Documents


1 download

DESCRIPTION

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. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: KELAS GENERIK

KELAS GENERIK

Page 2: 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

Page 3: 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.

Page 4: KELAS GENERIK

Pengertian (lanjutan)

• Perhatikan Contoh Program berikut:

Page 5: KELAS GENERIK

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.

Page 6: KELAS GENERIK

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

Page 7: KELAS GENERIK

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.

Page 8: KELAS GENERIK

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; } }

Page 9: KELAS GENERIK

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.

Page 10: KELAS 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.

Page 11: KELAS GENERIK

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.

Page 12: KELAS GENERIK

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>();

Page 13: KELAS GENERIK

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; } }

Page 14: KELAS GENERIK

Multiple Type Parameters

• Pernyataan berikut membuat dua instansiasi dari kelas OrderedPair:

• Pernyataan new OrderedPair<String, Integer>, menginstansiasi K sebagai sebuah String and V sebagai sebuah Integer. Karena itu, tipe parameter dari konstruktor OrderedPair adalah String dan Integer.

• Pembuatan interface generik, mengikuti konvensi yang sama seperti pada pembuatan kelas generik.

Pair<String, Integer> p1 = new OrderedPair<String, Integer>("Even", 8); Pair<String, String> p2 = new OrderedPair<String, String>("hello", "world");

Page 15: KELAS GENERIK

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>(...));

Page 16: KELAS GENERIK

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>(...));

Page 17: KELAS GENERIK

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.

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>(...));