import java.util.Objects;

class Buku {
    private final String judul;
    private final String isbn;

    public Buku(String judul, String isbn) {
        this.judul = judul;
        this.isbn = isbn;
    }

    // Override equals(Object): tanda tangan HARUS Object, bukan Buku.
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true; // referensi sama: nilai pasti sama
        }
        if (!(obj instanceof Buku lain)) {
            return false; // tipe lain atau null: tidak setara
        }
        return Objects.equals(isbn, lain.isbn)
                && Objects.equals(judul, lain.judul);
    }

    // Setiap override equals wajib diiringi hashCode yang konsisten.
    // Pembahasan tuntas ada di chapter hashCode dan equals.
    @Override
    public int hashCode() {
        return Objects.hash(isbn, judul);
    }
}

public class EqualsNilaiLogis {
    public static void main(String[] args) {
        Buku a = new Buku("Java Dasar", "978-602-1234-01-5");
        Buku b = new Buku("Java Dasar", "978-602-1234-01-5"); // data sama
        Buku c = new Buku("Java Lanjutan", "978-602-1234-02-2"); // data beda

        System.out.println("a == b          : " + (a == b));
        System.out.println("a.equals(b)     : " + (a.equals(b)));
        System.out.println("a.equals(c)     : " + (a.equals(c)));
        System.out.println("a.equals(null)  : " + (a.equals(null)));

        // Objects.equals aman untuk kedua sisi null.
        Buku kosong = null;
        System.out.println("Objects.equals(kosong, null) : "
                + Objects.equals(kosong, null));
    }
}
