Generic Pada Java
Generic Pada Java
Generics merupakan cara Java dalam melakukan generalisasi terhadap tipe data tanpa mengurangi kemampuan Java dalam menjaga keamanan penggunaan tipe data. Kenapa Pemrograman Generic? Generic Programming artinya kode yang dapat digunakan oleh beberapa objek yang tipenya berlainan. Misal kita memiliki kelas KoleksiString, KoleksiInteger dan KoleksiDouble, dengan menggunakan Generic Programming, kita dapat membuat kelas Koleksi yang dapat menampung data String, Integer maupun Double.
Misal, sebelum menggunakan Generic Programming, kita membuat kelas Koleksi untuk menampung String seperti ini :
akan
package khannedy.unikom.generic.data; public class KoleksiString { private String data; public String getData() { return data; } public void setData(String data) { this.data = data; } }
Untuk menampung data Integer : package khannedy.unikom.generic.data; public class KoleksiInteger { private int data; public int getData() { return data; } public void setData(int data) { this.data = data; } }
Andai kita membutuhkan banyak data yang akan di tampung dalam kelas Koleksi, maka mau tidak mau kita harus membuat setiap kelas Koleksi untuk tipe tertentu. Hal ini sangat melelahkan jika dilakukan. Dengan demikian, diperlukan Generic Programming untuk mengatasi masalah tersebut. Jika kita menggunakan Generic Programming, maka kita hanya cukup membuat satu buat kelas Koleksi, dan kelas tersebut dapat menampung seluruh objek dengan tipe data yang berbeda.
package khannedy.unikom.generic.data; public class Koleksi<T> { private T data; public T getData() { return data; } public void setData(T data) { this.data = data; } }
Dengan menggunakan Generic Programming diatas, kita dapat membuat Koleksi yang dapat menampung object dengan tipe apapun. Namun perlu diingat, karena Generic Programming hanya dapat menggunakan object, sehingga data primitive harus diimplementasikan dalam objek, misal int menjadi Integer, double menjadi Double.
package khannedy.unikom.generic; import khannedy.unikom.generic.data.Koleksi; public class Main { public static void main(String[] args) { Koleksi<String> a = new Koleksi<String>(); a.setData("String"); Koleksi<Integer> b = new Koleksi<Integer>(); b.setData(1); } }
Pendeklarasian Generic Programming ditandai dengan simbol diawali tanda (<) dan diakhiri tanda (>), setelah nama Kelas : class Koleksi<T>
yang
Dari kode diatas, berarti kita membuat simbol generic dengan simbol T, sehingga T dianggap tipe data dalam lingkup kelas tersebut. Saat pendeklarasian objek Koleksi, maka kita harus menentukan tipe T tersebut : Koleksi<String> a = new Koleksi<String>(); Kode diatas berarti kita mengganti simbol Tdengan tipe data String.
Selain dapat diimplementasikan dalam kelas, Generic Programming juga dapat diimplementasikan dalam sebuah metode. package khannedy.unikom.generic.data; public class Utilitas { public static <T> T ambilTengah(T[] data) { return data[data.length / 2]; } } Untuk membuat generic dalam sebelum return value, misal : public <T> T ambilTengah(T[] data) Atau : public <T> void kosongkan(T[] data) metode, simbol dideklarasikan
Perlu diingat jika Generic Programming dalam sebuah Metode, hanya berlaku untuk metode tersebut, tidak berlaku untuk metode yang lain dalam kelas yang sama, sehingga dibawah ini adalah salah :
package khannedy.unikom.generic.data; public class Utilitas { public <T> T ambilTengah(T[] data) { return data[data.length / 2]; } // simbol T tidak dikenal public T ambilAwal(T[] data){ return data[0]; } }
Dalam Generic Programming pun dikenal dengan pewarisan, pewarisan ini digunakan untuk membatasi masukkan data yang dapat digunakan dalam kode generic. Secara default simbol pada Generic Programming merupakan turunan kelas Object, sehingga tipe data apapun dapat masuk ke kode generic tersebut. public class Koleksi<T extends Object> Dan jika kita ingin membatasi kode generic yang kita buat untuk kelas tertentu dan turunannya, maka kita bisa memanfaatkan fitur pewarisan pada Generic Programming.
Misal, kita memiliki kelas Musisi, dan kelas MusisiBerbakat, dimana kelas MusisiBerbakat tersebut adalah turunan dari kelas Musisi. package khannedy.unikom.generic.data; public class Musisi { public void nyanyi() { // nyanyi } } ----------------------------------------------------------------------------package khannedy.unikom.generic.data; public class MusisiBerbakat extends Musisi{ public void dansa() { // dansa } }
Jika kita akan membatasi kode generic yang akan kita buat, hanya dapat digunakan untuk kelas Musisi dan keturunannya, maka kita dapat membuatnya seperti ini :
package khannedy.unikom.generic.data; public class Koleksi <T extends Musisi> { private T data; public T getData() { return data; } public void setData(T data) { this.data = data; } }
Dengan demikian, maka kelas Koleksi yang baru, hanya dapat digunakan oleh kelas Musisi dan keturunannya. Pewarisan tidak hanya dapat diterapkan pada kelas generic, dapat juda di metode generic. Selain membatasi, dengan pewarisan kita juga dapat memanggil metode dari kelas yang kita tentukan.
Misal pada kode diatas, kelas Musisi memiliki metode nyanyi(), dengan mewarisi kelas Musisi dalam kode generic yang kita buat, maka kita dapat memanggil seluruh metode yang ada pada kelas Musisi dalam kode generic kita : package khannedy.unikom.generic.data; public class Koleksi <T extends Musisi> { 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(); } } }
Jika kita tidak mewarisi sebuah kelas, maka metode yang hanya dapat dipanggil hanyalah metode yang ada pada kelas Object.