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 fungsionalitas 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 method. Class ini hanya dapat digunakan di dalam method tersebut dan dapat mengakses variabel lokal yang pada dasarnya bersifat final:
void process() {
String prefix = "Result: ";
class LocalHelper {
void print(int value) {
System.out.println(prefix + value);
}
}
new LocalHelper().print(42);
}Class inner anonim adalah class tanpa nama yang dibuat dan diinstansiasi dalam satu ekspresi. Class ini biasanya 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 ketika sebuah class hanya relevan untuk 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 barang, local inner class untuk menghitung diskon, dan anonymous inner class untuk memformat tanda terima akhir.
Kamu akan mengatur kodemu dalam dua file:
ShoppingCart.java: Buat outer class yang mengelola pengalaman berbelanja. ShoppingCart-mu harus memiliki field privatecustomerName(String).Di dalam ShoppingCart, definisikan nested inner class bernama
Itemdengan dua field private:name(String) danprice(double). Beri Item sebuah constructor untuk menginisialisasi kedua field, serta methodgetDetails()yang mengembalikan:[name]: $[price]ShoppingCart-mu memerlukan constructor yang menerima nama pelanggan, serta method bernama
checkout()yang menerima Item dan persentase diskon (double). Di dalamcheckout():- Buat local inner class bernama
DiscountCalculatordengan methodapplyDiscount(double originalPrice)yang mengembalikan harga setelah menerapkan persentase diskon, yang dihitung sebagaioriginalPrice - (originalPrice * discount / 100). - Gunakan local class untuk menghitung harga akhir.
- Buat anonymous inner class yang mengimplementasikan interface
Formatter(kamu akan mendefinisikannya) untuk memformat tanda terima. Anonymous class harus melakukan override pada methodformat()yang mengembalikan string tanda terima multibaris.
Method
checkout()harus mengembalikan string tanda terima yang 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 barang (String), dan harga barang (double). Persentase diskon ditetapkan sebesar10.0.Buat ShoppingCart dengan nama pelanggan. Lalu buat Item menggunakan sintaks referensi outer class:
cart.new Item(name, price). Panggilcheckout()dengan item dan diskon, lalu cetak tanda terima yang dikembalikan.
Kamu akan menerima tiga input secara berurutan: nama pelanggan, nama barang, dan harga barang.
Misalnya, jika inputnya adalah Alice, Laptop, dan 1000.0, harga akhir 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 membungkus logika yang hanya diperlukan di dalam satu method, dan anonymous class menyediakan implementasi interface yang cepat dan hanya digunakan satu kali!
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