sealed class (Java 17+)
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 52 dari 87.
Dalam Java tradisional, saat kamu membuat class, class lain mana pun dapat mewarisinya (kecuali jika kamu menandainya dengan final). Namun, bagaimana jika kamu ingin mengizinkan pewarisan, tetapi hanya dari class tertentu? Java 17 memperkenalkan sealed class agar kamu dapat mengontrol dengan tepat class mana saja yang dapat mewarisi class-mu.
sealed class secara eksplisit menyatakan subclass yang diizinkan menggunakan kata kunci sealed dan permits:
sealed abstract class Shape permits Circle, Rectangle, Triangle {
abstract double area();
}
final class Circle extends Shape {
double radius;
double area() { return Math.PI * radius * radius; }
}
final class Rectangle extends Shape {
double width, height;
double area() { return width * height; }
}
final class Triangle extends Shape {
double base, height;
double area() { return 0.5 * base * height; }
}Hanya Circle, Rectangle, dan Triangle yang dapat memperluas Shape. Class lain yang mencoba memperluasnya akan menyebabkan error kompilasi.
Setiap subclass yang diizinkan harus menggunakan salah satu dari tiga modifier: final (tidak dapat diperluas lebih lanjut), sealed (melanjutkan rantai pembatasan), atau non-sealed (membuka peluang untuk perluasan tanpa batas):
sealed class Vehicle permits Car, Truck { }
final class Car extends Vehicle { } // Tidak bisa diwariskan
non-sealed class Truck extends Vehicle { } // Siapa pun bisa mewarisi TruckSealed class sangat berguna saat dipadukan dengan pattern matching dalam ekspresi switch, karena compiler mengetahui semua subtype yang mungkin dan dapat memverifikasi kelengkapannya. Sealed class cocok digunakan untuk memodelkan sekumpulan tipe yang tetap dalam suatu domain, seperti cara pembayaran, tipe respons, atau bentuk geometris.
Tantangan
MudahMari kita buat sistem notifikasi yang menunjukkan penggunaan sealed class dengan membatasi jenis notifikasi yang dapat ada di aplikasimu. Kamu akan membuat hierarki yang hanya mengizinkan jenis notifikasi tertentu, dan setiap jenis menangani pengiriman dengan cara yang berbeda.
Kamu akan mengatur kodemu dalam lima file:
Notification.java: Buat sealed abstract class yang menjadi dasar untuk semua notifikasi. Class ini harus mengizinkan tepat tiga subclass:EmailNotification,SMSNotification, danPushNotification. Sealed class-mu memerlukan fieldmessage(String) dengan akses protected, constructor untuk menginisialisasinya, getter untuk message, dan method abstractdeliver()yang mengembalikan String untuk menjelaskan cara notifikasi dikirim.EmailNotification.java: Buat classfinalyang extends Notification. EmailNotification memiliki field tambahanrecipient(String) dengan akses private untuk alamat email. Constructornya harus menerima message dan recipient, lalu memanggil constructor induk dengansuper(). Methoddeliver()harus mengembalikan:Sending email to [recipient]: [message]SMSNotification.java: Buat classnon-sealedyang extends Notification. Dengan begitu, class lain dapat meng-extends-nya jika diperlukan di masa mendatang. SMSNotification memiliki field tambahanphoneNumber(String) dengan akses private. Constructornya menerima message dan nomor telepon. Methoddeliver()harus mengembalikan:Sending SMS to [phoneNumber]: [message]PushNotification.java: Buat classfinalyang extends Notification. PushNotification memiliki field tambahandeviceId(String) dengan akses private. Constructornya menerima message dan ID perangkat. Methoddeliver()harus mengembalikan:Sending push to device [deviceId]: [message]Main.java: Satukan sistem notifikasimu! Kamu akan menerima empat input: message (String), alamat email (String), nomor telepon (String), dan ID perangkat (String).Buat satu notifikasi untuk setiap jenis dengan message yang sama, tetapi gunakan informasi kontak masing-masing. Simpan ketiganya dalam array bertipe
Notification[]untuk menunjukkan polimorfisme dengan sealed class. Lalu lakukan iterasi melalui array dan cetak hasil pemanggilandeliver()pada setiap notifikasi.
Kamu akan menerima empat input secara berurutan: message, alamat email, nomor telepon, dan ID perangkat.
Perhatikan bagaimana sealed class membatasi hierarki: hanya tiga class yang diizinkan yang dapat extends Notification. Setiap subclass harus dideklarasikan sebagai final, sealed, atau non-sealed. Ini memberimu kendali penuh atas hierarki tipemu sekaligus tetap memungkinkan polimorfisme!
Coba sendiri
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Baca keempat input
String message = scanner.nextLine();
String email = scanner.nextLine();
String phoneNumber = scanner.nextLine();
String deviceId = scanner.nextLine();
// TODO: Buat satu dari setiap jenis notifikasi menggunakan message yang sama
// - EmailNotification dengan message dan email
// - SMSNotification dengan message dan phoneNumber
// - PushNotification dengan message dan deviceId
// TODO: Simpan ketiga notifikasi dalam array Notification[]
// Ini menunjukkan polimorfisme dengan sealed class
// TODO: Telusuri array dan cetak hasil deliver()
// untuk setiap notifikasi
}
}
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