import java.util.ArrayList;
import java.util.List;

// Class final: tidak bisa diwarisi lalu dilonggarkan aturannya.
final class BukuTetap {
    // Semua field private final: hanya diisi di constructor.
    private final String judul;
    private final List<String> penulis;

    public BukuTetap(String judul, List<String> penulis) {
        this.judul = judul;
        this.penulis = new ArrayList<>(penulis); // defensive copy saat masuk
    }

    public String judul() {
        return judul;
    }

    public List<String> penulis() {
        return List.copyOf(penulis); // defensive copy saat keluar
    }

    // "Perubahan" berarti objek baru; objek lama tidak pernah berubah.
    public BukuTetap denganJudul(String judulBaru) {
        return new BukuTetap(judulBaru, penulis);
    }
}

public class KelasImmutable {
    public static void main(String[] args) {
        List<String> namaPenulis = new ArrayList<>();
        namaPenulis.add("Budi Santoso");

        BukuTetap buku = new BukuTetap("Java Dasar", namaPenulis);

        // Mutasi list luar tidak merambat ke dalam objek.
        namaPenulis.add("Siti Rahayu");
        System.out.println("penulis buku : " + buku.penulis());
        System.out.println("list luar    : " + namaPenulis);

        // "Mengubah" judul menghasilkan objek baru.
        BukuTetap edisiBaru = buku.denganJudul("Java Dasar Edisi 2");
        System.out.println("judul lama   : " + buku.judul());
        System.out.println("judul baru   : " + edisiBaru.judul());
    }
}
