// Record: satu baris deklarasi untuk class pembawa data.
record Buku(String judul, String penulis, int tahunTerbit) {

    // Compact constructor: validasi tanpa menulis parameter dan field manual.
    Buku {
        if (tahunTerbit <= 0) {
            throw new IllegalArgumentException(
                    "tahunTerbit harus positif: " + tahunTerbit);
        }
        judul = judul.trim(); // parameter boleh ditulis ulang sebelum disimpan
    }
}

record Titik(int x, int y) {
    // Body tambahan: method biasa tetap boleh ada di dalam record.
    double jarakKeTitikNol() {
        return Math.sqrt(x * x + y * y);
    }
}

public class RekapRecord {
    public static void main(String[] args) {
        Buku a = new Buku("Java Dasar", "Budi Santoso", 2024);
        Buku b = new Buku("Java Dasar", "Budi Santoso", 2024);
        Buku c = new Buku("Java Lanjutan", "Siti Rahayu", 2025);

        // equals dan hashCode dihasilkan otomatis dari seluruh komponen.
        System.out.println("a.equals(b) : " + a.equals(b));
        System.out.println("a.equals(c) : " + a.equals(c));

        // toString otomatis: format NamaRecord[komponen=nilai, ...].
        System.out.println("a           : " + a);

        // Accessor memakai nama komponen, tanpa awalan "get".
        System.out.println("judul a     : " + a.judul());

        // Validasi compact constructor benar-benar aktif.
        try {
            new Buku("Buku Lama", "Anonim", -1);
        } catch (IllegalArgumentException e) {
            System.out.println("validasi aktif : " + e.getMessage());
        }

        Titik t = new Titik(3, 4);
        System.out.println("titik       : " + t);
        System.out.printf("jarak ke (0,0): %.2f%n", t.jarakKeTitikNol());
    }
}
