Menguasai Java Generics – Membangun Kode yang Dapat Digunakan Kembali dan Aman Tipe
Java Generics – Membangun Kode yang Dapat Digunakan Kembali dan Aman Tipe
Panduan ini menjelaskan generik Java, cara membuat kelas dan metode generik, serta manfaatnya, diilustrasikan dengan contoh yang jelas.
Generik Java memungkinkan Anda menulis satu kelas, antarmuka, atau metode yang dapat beroperasi pada banyak tipe data berbeda, sambil mempertahankan keamanan waktu kompilasi.
Catatan: Generik tidak bekerja dengan tipe primitif (int, float, char, dll).
Kelas Generik Java
Dengan mendeklarasikan parameter tipe, Anda dapat membuat kelas yang bekerja dengan tipe objek apa pun.
Contoh: Buat Kelas Generik
class Main { public static void main(String[] args) { GenericsClass<Integer> intObj = new GenericsClass<>(5); System.out.println("Generic Class returns: " + intObj.getData()); GenericsClass<String> stringObj = new GenericsClass<>("Java Programming"); System.out.println("Generic Class returns: " + stringObj.getData()); } } class GenericsClass<T> { private T data; public GenericsClass(T data) { this.data = data; } public T getData() { return this.data; } }
Output
Generic Class returns: 5 Generic Class returns: Java Programming
Dalam contoh di atas, GenericsClass adalah kelas generik tempat T adalah parameter tipe. Dua instance dibuat:
- intObj – T diganti dengan
Integer, jadi kelas bekerja dengan integer. - stringObj – T diganti dengan
String, jadi kelas bekerja dengan string.
Metode Generik Java
Metode juga dapat bersifat generik, memungkinkan mereka untuk menerima argumen tipe apa pun sambil mempertahankan keamanan tipe.
Contoh: Buat Metode Generik
class Main { public static void main(String[] args) { DemoClass demo = new DemoClass(); demo.<String>genericsMethod("Java Programming"); demo.<Integer>genericsMethod(25); } } class DemoClass { public <T> void genericsMethod(T data) { System.out.println("Generics Method:"); System.out.println("Data Passed: " + data); } }
Output
Generics Method: Data Passed: Java Programming Generics Method: Data Passed: 25
Saat compiler dapat menyimpulkan tipe, Anda dapat menghilangkan argumen tipe eksplisit:
demo.genericsMethod("Java Programming");
Tipe Terbatas
Kadang Anda ingin tipe generik hanya menerima keluarga kelas tertentu. Tipe terbatas mencapai ini menggunakan kata kunci extends.
Sintaks: <T extends A> – T dapat menjadi A atau subtipe apa pun dari A.
Contoh: Tipe Terbatas
class GenericsClass <T extends Number> { public void display() { System.out.println("This is a bounded type generics class."); } } class Main { public static void main(String[] args) { // GenericsClass<String> obj = new GenericsClass<>(); // compile‑time error } }
Di sini, GenericsClass hanya menerima tipe numerik (Integer, Double, dll.). Mencoba membuat instance-nya dengan String menyebabkan kesalahan waktu kompilasi:
GenericsClass<String> obj = new GenericsClass<>(); ^ reason: inference variable T has incompatible bounds equality constraints: String lower bounds: Number where T is a type-variable: T extends Number declared in class GenericsClass
Keuntungan Generik Java
1. Reusabilitas Kode
Kode generik dapat beroperasi pada banyak tipe data, mengurangi duplikasi. Contohnya, satu metode dapat memproses integer, string, dan objek kustom.
2. Pemeriksaan Tipe Waktu Kompilasi
Karena parameter tipe diketahui pada waktu kompilasi, compiler dapat mendeteksi ketidakcocokan tipe sebelum program dijalankan.
3. Integrasi yang Lancar dengan Koleksi
Framework koleksi Java didasarkan pada generik, memungkinkan koleksi untuk menegakkan keamanan tipe. Contoh:
ArrayList<String> list1 = new ArrayList<>(); ArrayList<Integer> list2 = new ArrayList<>();
Kelas koleksi lainnya (LinkedList, Queue, Map, dll.) juga menggunakan generik untuk manfaat yang sama.