Intro Pada Java rilis 5.0, terjadi banyak penambahan pada bahasa Java. Selain dari annotation, penambahan yang penting lainnya adalah generics Jika anda melihat ada simbol seperti <E> atau maka itu menandakan bagian yang diberi simbol adalah generics
Why Generics? // Anggap anda ingin membuat koleksi String dalam Vector. // Tak sengaja, anda memasukkan unsur Integer ke // dalamnya. Compiler tidak akan mendeteksi hal ini. // Coding tersebut tidak type safe. Vector v = new Vector(); v.add(new String(“valid string”)); // sengaja v.add(new Integer(4)); // tidak sengaja // ClassCastException muncul waktu runtime String s = (String)v.get(1); 5
Why Generics? Masalah: tipe data unsur pada Collection
Compiler tidak bisa memverifikasi tipe data unsur pada Collection Proses assignment memerlukan type casting Dapat memunculkan ClassCastException saat runtime
Solusi: Generics
6
Beritahu compiler tipe data collection Biarkan compiler yang melakukan casting Compiler akan mengecek apakah anda memasukkan data yang benar jika tidak muncul error type mismatch
Contoh penggunaan generics Buat class collection namun menspesifikkan tipe datanya. Sejak J2SE 5.0, semua class collection ditulis ulang menjadi bentuk generics.
// Buat Vector dgn tipe data String Vector<String> vs = new Vector<String>(); vs.add(new Integer(5)); // Error terdeteksi saat // kompilasi vs.add(new String(“hello”)); String s = vs.get(0); // tak perlu casting
Coding yang dapat digunakan oleh beberapa objek yang tipenya berlainan. Andai kita memiliki class KoleksiString, KoleksiInteger, KoleksiDouble. Dengan menggunakan generic programming, kita dapat membuat class Koleksi yang dapat menampung data String, Integer maupun Double
Contoh sebelum generic public class KoleksiInteger { private int data; public int getData() { return data; } public void setData(int data) { this.data = data; } }
3 coding koleksi tadi cukup melelahkan jika dilakukan, apalagi kalau ingin menambah koleksi baru Maka gunakan generic untuk mengatasi masalah tersebut dengan hanya membuat satu class koleksi yang generic
Contoh generic buatan sendiri public class Koleksi { private T data; public T getData() { return data; } public void setData(T data) { this.data = data; } } Generic ditandai dengan tanda < >. Pada kode di atas berarti kita membuat generic dengan simbol T, sehingga T dianggap sebagai tipe data dalam lingkup class tersebut. Sewaktu class Koleksi dipakai, T diganti menjadi tipe data tertentu. Koleksi<String> a = new Koleksi<String>(); 16
Sehingga tipe data primitif harus diubah ke bentuk classnya Contoh: int menjadi Integer
public class Main { public static void main(String[] args) { Koleksi<String> a = new Koleksi<String>(); a.setData("String"); Koleksi b = new Koleksi(); b.setData(1); } }
Contoh lain generic buatan sendiri public class Pair { F first; S second; public Pair(F f, S s) { first = f; second = s; } public void setFirst(F f){ first = f; } public F getFirst(){ return first; } public void setSecond(S s){ second = s; } public S getSecond(){ return second; } [email protected] }19
Pemakaiannya public class MyOwnGenericClass { public static void main(String[] args) { // Buat objek Pair Number n1 = new Integer(5); String s1 = new String("Sun"); Pair p1 = new Pair(n1, s1); System.out.println(“nilai pertama p1 (pada awalnya) = " + p1.getFirst()); System.out.println("nilai kedua p1 (pada awalnya) = " + p1.getSecond()); // Set internal variables of p1. p1.setFirst(new Long(6L)); p1.setSecond(new String("rises")); System.out.println("nilai pertama p1 (setelah diubah) = " + p1.getFirst()); System.out.println("nilai kedua p1 (setelah diubah) = " + p1.getSecond()); } [email protected] } 20
Method generic
Generic juga dapat dipakai pada method. Cara: simbol generic dideklarasi sebelum return value
public T ambilTengah(T[] data) public void kosongkan(T[] data)
public class Utilitas { public static T ambilTengah(T[] data) { return data[data.length / 2]; } }
Pada method generic, simbol hanya berlaku pada method itu saja dan tidak berlaku pada method lain dalam class
public class Utilitas { public T ambilTengah(T[] data) { return data[data.length / 2]; } // simbol T tidak dikenal public T ambilAwal(T[] data){ return data[0]; } } 22
Contoh pewarisan pada generic public class Musisi { public void nyanyi() { // nyanyi } } public class MusisiBerbakat extends Musisi{ public void dansa() { // dansa } }
public class Koleksi { private T data; public T getData() { return data; } public void setData(T data) { this.data = data; } }
Pada contoh ini, class Koleksi hanya dapat digunakan oleh class Musisi dan turunannya 24
Contoh pewarisan pada generic public class Koleksi { private T data; public T getData() { return data; } public void setData(T data) { this.data = data; } public void nyanyiEuy(){ if(this.data != null){ this.data.nyanyi(); } } }
25
Jika kita mengkhususkan generic untuk class tertentu, maka method class tersebut pun dapat dipanggil Jika tidak, maka hanya method dari class Object saja yang dikenal