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 membuat pemeliharaan menjadi merepotkan.
Generik menyelesaikan masalah ini dengan memungkinkan kamu menulis class dan method yang berfungsi dengan tipe apa pun, sekaligus tetap menjaga keamanan tipe. Kamu mendefinisikan placeholder (yang disebut parameter tipe) yang akan digantikan dengan tipe sebenarnya saat kamu menggunakan class tersebut:
// Tanpa generics: menggunakan Object, perlu casting
List list = new ArrayList();
list.add("Hello");
String s = (String) list.get(0); // Perlu casting manual
// Dengan generics: tipe data aman, tanpa casting
List<String> list = new ArrayList<String>();
list.add("Hello");
String s = list.get(0); // Tidak perlu castingTanda 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 langsung mendeteksi error tersebut alih-alih gagal saat runtime.
Generics memberikan dua manfaat utama: menghilangkan kebutuhan untuk melakukan casting secara eksplisit dan mendeteksi kesalahan tipe data saat kompilasi, bukan saat runtime. Ini membuat kodemu lebih aman dan rapi. Dalam pelajaran berikutnya, kita akan mempelajari cara membuat class dan method generikmu sendiri.
Tantangan
MudahMari buat sistem penyimpanan sederhana yang menunjukkan keunggulan generics dengan membandingkan cara lama (menggunakan Object dengan casting) dan cara baru (menggunakan generics yang aman dari segi 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 privatcontentbertipeObject. Sertakan constructor yang menerima Object dan menyimpannya, serta methodgetContent()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 tipeTdalam deklarasinya. Class ini memerlukan field privatcontentbertipeT, constructor yang menerima nilai bertipeT, dan methodgetContent()yang mengembalikan tipeT. 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]Selanjutnya, gunakan cara generics: 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 dalam bentuk String, yang akan kamu parse).
Perhatikan perbedaan utamanya: dengan OldBox, kamu harus melakukan casting menggunakan (String) box.getContent() dan berharap tipenya benar. Dengan GenericBox, compiler mengetahui tipenya sehingga tidak perlu casting. Inilah manfaat utama generics: keamanan tipe tanpa kerepotan 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, lalu cetak: "OldBox (with cast): [value]"
// TODO: Buat GenericBox<String> yang menyimpan kata tersebut
// Ambil nilainya tanpa cast, lalu cetak: "GenericBox (no cast): [value]"
// TODO: Buat GenericBox<Integer> yang menyimpan angka tersebut
// Ambil nilainya, lalu cetak: "GenericBox Integer: [value]"
// TODO: Cetak satu baris kosong, lalu cetak:
// "Type safety: Generics catch errors at compile time!"
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPClass dan ObjectKata Kunci thisMethodField (Atribut)Method KonstruktorOverloading KonstruktorRangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan Dasar (extends)Kata Kunci superMethod Overriding (@Override)Rantai KonstruktorKelas ObjectPewarisan Tunggal dan BertingkatMengapa Tidak Ada Pewarisan Multi-KelasRangkuman: Hierarki Karyawan7method Khusus & class Object
method toString()equals() dan hashCode()method clone()compareTo() dan ComparableAntarmuka ComparatorUlasan: Pengurutan Kustom10Penanganan Exception dalam OOP
Hierarki class ExceptionException KustomError Checked vs UncheckedPola Try-with-ResourcesRekap: Pengguna Tervalidasi2Modifier Akses & Enkapsulasi
Ikhtisar Tingkat AksesMethod Getter dan SetterPenyembunyian InformasiKata Kunci finalUlasan: Pengelola Rekening Bank5Polimorfisme
Dasar method overloadingMethod overriding (Saat program berjalan)Upcasting dan downcastingOperator instanceofclass dan method abstrakUlasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanAgregasi vs Komposisiinner, nested, dan anonymous classEnum dan method Enumrecord (Java 16+)sealed class (Java 17+)11Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola BuilderPola ObserverPola Strategy3property class dan Anggota Statis
Variabel Instance vs Statismethod StatisBlok StatisKonstanta (static final)Rangkuman: Penghitung dan Utilitas6Antarmuka & Kelas Abstrak
Pengantar AntarmukaMengimplementasikan AntarmukaImplementasi Beberapa AntarmukaDefault & Static pada AntarmukaKelas Abstrak vs AntarmukaAntarmuka FungsionalRekap: Sistem Pembayaran9Generik
Pengantar GenerikClass GenerikMethod GenerikParameter Tipe BerbatasWildcard (?, extends, super)Ulasan: Wadah GenerikLatihan sendiri: Compiler Java online