public class HirarkiTertutup {

    // Hierarki tertutup: hanya tiga implementasi berikut yang diizinkan.
    sealed interface Hasil permits Sukses, Gagal, Pemuatan { }

    record Sukses(String data) implements Hasil { }
    record Gagal(int kode, String pesan) implements Hasil { }
    record Pemuatan(long milidetik) implements Hasil { }

    static String ringkas(Hasil hasil) {
        // Tanpa default: compiler menjamin seluruh subtype tercakup.
        return switch (hasil) {
            case Sukses s -> "OK: " + s.data();
            case Gagal g -> "galat " + g.kode() + " (" + g.pesan() + ")";
            case Pemuatan p -> "durasi " + p.milidetik() + " ms";
        };
    }

    public static void main(String[] args) {
        Hasil[] kejadian = {
            new Sukses("profil termuat"),
            new Gagal(404, "berkas tidak ditemukan"),
            new Pemuatan(273)
        };
        for (Hasil h : kejadian) {
            System.out.println(ringkas(h));
        }
    }
}
