Menu
CoddyTech

Pengantar Generik

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 53 dari 87.

Bayangkan kamu perlu membuat class yang menyimpan sebuah nilai dan mengambilnya kembali nanti. Tanpa generics, kamu harus menulis class terpisah untuk setiap tipe: satu untuk Integer, satu untuk String, satu untuk Double, dan seterusnya. Ini menyebabkan duplikasi kode dan menyulitkan pemeliharaan.

Generik mengatasi masalah ini dengan memungkinkan kamu menulis class dan method yang bekerja dengan tipe apa pun, sambil tetap menjaga keamanan tipe. Kamu mendefinisikan placeholder (disebut parameter tipe) yang akan diganti dengan tipe sebenarnya saat kamu menggunakan class:

// Tanpa generics: menggunakan Object, perlu konversi tipe
List list = new ArrayList();
list.add("Hello");
String s = (String) list.get(0);  // Perlu konversi tipe secara manual

// Dengan generics: tipe data aman, tanpa konversi tipe
List<String> list = new ArrayList<String>();
list.add("Hello");
String s = list.get(0);  // Tidak perlu konversi tipe

Tanda kurung sudut <T> menunjukkan parameter tipe. Saat kamu menulis List<String>, kamu memberi tahu compiler bahwa list ini hanya akan berisi string. Jika kamu mencoba menambahkan bilangan bulat, compiler akan langsung mendeteksi error, bukan gagal saat program dijalankan.

Generics memberikan dua manfaat utama: menghilangkan kebutuhan untuk melakukan casting secara eksplisit dan mendeteksi error tipe saat kompilasi, bukan saat runtime. Dengan begitu, kodemu menjadi lebih aman dan rapi. Dalam pelajaran berikutnya, kita akan mempelajari cara membuat class dan method generik sendiri.

challenge icon

Tantangan

Mudah

Mari buat sistem penyimpanan sederhana yang menunjukkan keunggulan generics dengan membandingkan cara lama (menggunakan Object dengan casting) dan cara baru (menggunakan generics dengan keamanan tipe).

Kamu akan membuat tiga file untuk melihat perbedaannya secara langsung:

  • OldBox.java: Buat class yang menyimpan nilai dengan cara sebelum generics. OldBox-mu harus memiliki field privat content bertipe Object. Sertakan constructor yang menerima Object dan menyimpannya, serta method getContent() yang mengembalikan Object. Cara ini berfungsi, tetapi memerlukan casting saat mengambil nilai.
  • GenericBox.java: Sekarang buat versi modern yang aman dari segi tipe dengan menggunakan generics. GenericBox-mu harus menggunakan parameter tipe T dalam deklarasinya. Class ini memerlukan field privat content bertipe T, constructor yang menerima nilai T, dan method getContent() yang mengembalikan tipe T. Tidak perlu casting saat menggunakan class ini!
  • Main.java: Tunjukkan kedua cara tersebut secara berdampingan. Kamu akan menerima dua input: sebuah kata (String) dan sebuah angka (integer).

    Pertama, gunakan cara lama: buat OldBox yang menyimpan kata tersebut, lalu ambil nilainya dengan casting ke String dan cetak: OldBox (with cast): [value]

    Berikutnya, gunakan cara generic: buat GenericBox<String> yang menyimpan kata yang sama, ambil nilainya tanpa casting, lalu cetak: GenericBox (no cast): [value]

    Kemudian, tunjukkan bahwa generics juga berfungsi dengan integer: buat GenericBox<Integer> yang menyimpan angka tersebut, ambil nilainya, lalu cetak: GenericBox Integer: [value]

    Terakhir, cetak satu baris kosong, lalu cetak: Type safety: Generics catch errors at compile time!

Kamu akan menerima dua input secara berurutan: sebuah kata (String) dan sebuah angka (integer sebagai String, yang akan kamu parse).

Perhatikan perbedaan utamanya: dengan OldBox, kamu harus melakukan casting (String) box.getContent() dan berharap tipenya benar. Dengan GenericBox, compiler mengetahui tipenya sehingga tidak perlu casting. Inilah manfaat utama generics: keamanan tipe tanpa kerepotan melakukan casting!

Coba sendiri

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String word = scanner.nextLine();
        int number = Integer.parseInt(scanner.nextLine());
        
        // TODO: Buat OldBox yang menyimpan kata tersebut
        // Ambil nilainya dengan cast ke String dan cetak: "OldBox (with cast): [value]"
        
        // TODO: Buat GenericBox<String> yang menyimpan kata tersebut
        // Ambil nilainya tanpa cast dan cetak: "GenericBox (no cast): [value]"
        
        // TODO: Buat GenericBox<Integer> yang menyimpan angka tersebut
        // Ambil nilainya dan cetak: "GenericBox Integer: [value]"
        
        // TODO: Cetak satu baris kosong, lalu cetak:
        // "Type safety: Generics catch errors at compile time!"
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Java online