Ulasan: Wadah Generik
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 58 dari 87.
Tantangan
MudahMari kita buat sistem penyimpanan serbaguna yang menggabungkan semua hal yang telah kamu pelajari tentang generik! Kamu akan membuat class Container yang dapat menyimpan, mengambil, dan memproses elemen dengan tipe apa pun, beserta method utilitas yang menunjukkan penggunaan wildcard.
Kamu akan menyusun kodemu dalam tiga file:
Container.java: Buat class generikContainer<T>yang mengelola kumpulan item. Container-mu harus menggunakanArrayList<T>secara internal untuk menyimpan elemen. Sertakan method untukadd(T item)guna menambahkan elemen,get(int index)untuk mengambil elemen pada posisi tertentu,size()untuk mengembalikan jumlah item, danisEmpty()untuk memeriksa apakah container tidak memiliki elemen. Tambahkan juga methodgetAll()yang mengembalikan list internal.ContainerUtils.java: Buat class utilitas dengan method generik statis yang bekerja dengan container-mu:printAll(Container<?> container)- Menggunakan wildcard tak berbatas untuk mencetak semua elemen dalam container apa pun, satu elemen per baris.countItems(Container<? extends Number> container)- Menggunakan wildcard berbatas atas untuk menghitung jumlah semua nilai numerik dalam container, lalu mengembalikan hasilnya sebagaidouble.addDefaults(Container<? super Integer> container)- Menggunakan wildcard berbatas bawah untuk menambahkan bilangan bulat 1, 2, dan 3 ke container apa pun yang dapat menyimpan bilangan bulat.<T> T getLastOrDefault(Container<T> container, T defaultValue)- Method generik yang mengembalikan elemen terakhir dalam container, atau nilai default jika container kosong.Main.java: Satukan sistem container generikmu! Kamu akan menerima tiga input: sebuah kata (String), sebuah bilangan bulat, dan sebuah bilangan desimal.Pertama, buat
Container<String>dan tambahkan kata ke dalamnya dua kali. CetakString container:lalu gunakanprintAlluntuk menampilkan isinya.Berikutnya, buat
Container<Double>dan tambahkan nilai desimal ke dalamnya. Cetak satu baris kosong, laluNumber sum: [sum]menggunakansumValues.Lalu, buat
Container<Number>dan panggiladdDefaultspadanya. Cetak satu baris kosong, laluAfter adding defaults:dan gunakanprintAlluntuk menampilkan isinya.Terakhir, buat
Container<Integer>yang kosong dan gunakangetLastOrDefaultdengan input bilangan bulatmu sebagai nilai default. Cetak satu baris kosong, laluLast or default: [result].
Kamu akan menerima tiga input secara berurutan: sebuah kata (String), sebuah bilangan bulat, dan sebuah bilangan desimal.
Tantangan ini menggabungkan class generik, method generik, parameter tipe berbatas, dan ketiga jenis wildcard. Perhatikan bagaimana setiap bagian memiliki tujuan berbeda: class generik menyediakan penyimpanan yang aman dari kesalahan tipe, wildcard berbatas memungkinkan pembacaan dan penulisan yang fleksibel, dan method generik menawarkan operasi yang dapat digunakan kembali pada berbagai tipe container!
Coba sendiri
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Baca input
String word = scanner.nextLine();
int intValue = Integer.parseInt(scanner.nextLine());
double doubleValue = Double.parseDouble(scanner.nextLine());
// TODO: Buat Container<String> dan tambahkan kata tersebut dua kali
// Cetak "String container:", lalu gunakan ContainerUtils.printAll()
// TODO: Buat Container<Double> dan tambahkan nilai double
// Cetak baris kosong, lalu "Number sum: [sum]" menggunakan ContainerUtils.countItems()
// TODO: Buat Container<Number> dan panggil ContainerUtils.addDefaults() untuknya
// Cetak baris kosong, lalu "After adding defaults:" dan gunakan ContainerUtils.printAll()
// TODO: Buat Container<Integer> yang kosong
// Gunakan ContainerUtils.getLastOrDefault() dengan intValue sebagai nilai default
// Cetak baris kosong, lalu "Last or default: [result]"
}
}
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