inner, nested, dan anonymous class
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 49 dari 87.
Java memungkinkan kamu mendefinisikan class di dalam class lain. Inner class ini membantu mengatur kode dengan mengelompokkan fungsi yang saling terkait dan dapat mengakses anggota class luar secara langsung.
class dalam bersarang didefinisikan sebagai anggota dari class lain. Class ini memiliki akses ke semua field dan method dari class luar, termasuk yang bersifat private:
class Outer {
private String message = "Hello";
class Inner {
void display() {
System.out.println(message); // Bisa mengakses field private
}
}
}
// Penggunaan
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.display(); // Mencetak: Hellolocal inner class didefinisikan di dalam sebuah method. Class ini hanya dapat digunakan di dalam method tersebut dan dapat mengakses variabel lokal yang secara efektif bersifat final:
void process() {
String prefix = "Result: ";
class LocalHelper {
void print(int value) {
System.out.println(prefix + value);
}
}
new LocalHelper().print(42);
}class dalam tanpa nama adalah class tanpa nama yang dibuat dan diinstansiasi dalam satu ekspresi. Biasanya, class ini digunakan untuk mengimplementasikan interface atau memperluas class secara langsung:
Comparator<String> comp = new Comparator<String>() {
@Override
public int compare(String a, String b) {
return a.length() - b.length();
}
};Inner class sangat berguna saat sebuah class hanya relevan bagi satu class lain, sehingga kodemu tetap terorganisasi dan terenkapsulasi.
Tantangan
MudahMari buat sistem keranjang belanja yang menampilkan ketiga jenis inner class. Kamu akan membuat ShoppingCart yang menggunakan nested inner class untuk merepresentasikan item, local inner class untuk menghitung diskon, dan anonymous inner class untuk memformat struk akhir.
Kamu akan menyusun kodemu dalam dua file:
ShoppingCart.java: Buat outer class yang mengelola pengalaman berbelanja.ShoppingCartharus memiliki field privatcustomerName(String).Di dalam
ShoppingCart, definisikan nested inner class bernamaItemdengan dua field privat:name(String) danprice(double). BeriItemsebuah konstruktor untuk menginisialisasi kedua field dan methodgetDetails()yang mengembalikan:[name]: $[price]ShoppingCartmemerlukan konstruktor yang menerima nama pelanggan, serta method bernamacheckout()yang menerima sebuah Item dan persentase diskon (double). Di dalamcheckout():- Buat local inner class bernama
DiscountCalculatordengan methodapplyDiscount(double originalPrice)yang mengembalikan harga setelah persentase diskon diterapkan. - Gunakan local class untuk menghitung harga akhir.
- Buat anonymous inner class yang mengimplementasikan interface
Formatter(yang akan kamu definisikan) untuk memformat struk. Anonymous class harus meng-override methodformat()yang mengembalikan string struk beberapa baris.
Method
checkout()harus mengembalikan string struk yang sudah diformat dengan format persis berikut:--- Receipt --- Customer: [customerName] Item: [item details from getDetails()] Discount: [discount]% Final Price: $[calculated price]- Buat local inner class bernama
Formatter.java: Definisikan interface sederhana dengan satu method:String format(). Interface ini akan diimplementasikan oleh anonymous inner class di dalam method checkout.Main.java: Hidupkan keranjang belanjamu! Kamu akan menerima tiga input: nama pelanggan (String), nama item (String), dan harga item (double). Persentase diskon ditetapkan sebesar10.0.Buat
ShoppingCartdengan nama pelanggan. Lalu buatItemmenggunakan sintaks referensi outer class:cart.new Item(name, price). Panggilcheckout()dengan item dan diskon, lalu cetak struk yang dikembalikan.
Kamu akan menerima tiga input secara berurutan: nama pelanggan, nama item, dan harga item.
Misalnya, jika inputnya adalah Alice, Laptop, dan 1000.0, harga akhirnya setelah diskon 10% adalah 900.0.
Perhatikan bagaimana setiap jenis inner class memiliki tujuan yang berbeda: nested class mengelompokkan data terkait dengan outer class, local class merangkum logika yang hanya diperlukan di dalam satu method, dan anonymous class menyediakan implementasi interface sekali pakai dengan cepat!
Coba sendiri
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Baca input
String customerName = scanner.nextLine();
String itemName = scanner.nextLine();
double itemPrice = scanner.nextDouble();
double discount = 10.0;
// TODO: Buat ShoppingCart dengan nama pelanggan
// TODO: Buat Item menggunakan: cart.new Item(itemName, itemPrice)
// TODO: Panggil checkout() dengan item dan diskon, lalu cetak hasilnya
}
}
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 PembayaranLatihan sendiri: Compiler Java online