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

class Buku {
    // Versi mutable: referensi list dari luar tersimpan apa adanya.
    private final String judul;
    private final List<String> penulis;

    public Buku(String judul, List<String> penulis) {
        this.judul = judul;
        this.penulis = penulis; // referensi luar masuk tanpa disalin
    }

    public List<String> penulis() {
        return penulis; // referensi internal bocor ke luar
    }
}

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

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

        // Mutasi list luar...
        namaPenulis.add("Siti Rahayu");

        // ...muncul di dalam objek: efek aliasing.
        System.out.println("penulis buku: " + buku.penulis());

        // Bocor dua arah: mutasi lewat getter ikut mengubah list luar.
        buku.penulis().clear();
        System.out.println("list luar setelah clear: " + namaPenulis);
    }
}
