Menu
CoddyTech

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 Truck

Sealed 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.

challenge icon

Tantangan

Mudah

Mari 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, dan PushNotification. Sealed class-mu memerlukan field message (String) dengan akses protected, constructor untuk menginisialisasinya, getter untuk message, dan method abstract deliver() yang mengembalikan String untuk menjelaskan cara notifikasi dikirim.
  • EmailNotification.java: Buat class final yang extends Notification. EmailNotification memiliki field tambahan recipient (String) dengan akses private untuk alamat email. Constructornya harus menerima message dan recipient, lalu memanggil constructor induk dengan super(). Method deliver() harus mengembalikan: Sending email to [recipient]: [message]
  • SMSNotification.java: Buat class non-sealed yang extends Notification. Dengan begitu, class lain dapat meng-extends-nya jika diperlukan di masa mendatang. SMSNotification memiliki field tambahan phoneNumber (String) dengan akses private. Constructornya menerima message dan nomor telepon. Method deliver() harus mengembalikan: Sending SMS to [phoneNumber]: [message]
  • PushNotification.java: Buat class final yang extends Notification. PushNotification memiliki field tambahan deviceId (String) dengan akses private. Constructornya menerima message dan ID perangkat. Method deliver() 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 pemanggilan deliver() 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
        
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Java online