import java.util.List;

public class PencocokanTipe {

    sealed interface BangunDatar permits Lingkaran, Persegi, PersegiPanjang { }
    record Lingkaran(double jari) implements BangunDatar { }
    record Persegi(double sisi) implements BangunDatar { }
    record PersegiPanjang(double lebar, double tinggi) implements BangunDatar { }

    // Gaya lama: uji tipe lalu cast manual ke variabel baru.
    static String labelLama(Object nilai) {
        if (nilai instanceof String) {
            String teks = (String) nilai;
            return "teks: " + teks.length() + " karakter";
        }
        return "bukan teks";
    }

    // Pattern matching: uji tipe sekaligus mengikat variabel teks.
    static String labelBaru(Object nilai) {
        if (nilai instanceof String teks) {
            return "teks: " + teks.length() + " karakter";
        }
        return "bukan teks";
    }

    static double luas(BangunDatar b) {
        return switch (b) {
            case Lingkaran l when l.jari() > 0 -> Math.PI * l.jari() * l.jari();
            case Lingkaran l -> 0;                      // jari() <= 0
            case Persegi p -> p.sisi() * p.sisi();
            case PersegiPanjang pp -> pp.lebar() * pp.tinggi();
        };
    }

    public static void main(String[] args) {
        System.out.println("lama : " + labelLama("Halo"));
        System.out.println("baru : " + labelBaru(42));

        var bentuk = List.of(
                new Lingkaran(7),
                new Persegi(9),
                new PersegiPanjang(4, 5),
                new Lingkaran(-1));
        for (BangunDatar b : bentuk) {
            System.out.printf("%-32s luas %.2f%n", b, luas(b));
        }
    }
}
