• Tidak ada hasil yang ditemukan

equals dan hashcode

Dalam dokumen c2ed0 java desktop ifnu bima (Halaman 74-77)

• hashCode()

Method toString digunakan oleh Java untuk mendapatkan representasi String dari sebuah object atau class. Implementasi default dari Class object adalah mencetak nama class diikuti oleh “alamat memory dari object tersebut”. Mari kita lihat bagaimana implementasi standard dari method toString ini :

public class ToStringTest {

public static void main(String[] args) { ToStringTest test = new ToStringTest();

System.out.println("implementasi toString dari class Object " + "menghasilkan : " + test);

} }

kalau kita compile dan jalankan kode di atas hasilnya : $ javac ToStringTest.java

$ java ToStringTest

implementasi toString dari class Object menghasilkan : ToStringTest@54fc9944 $

terlihat bahwa string yang dikembalikan dari method toString tidak deskriptif sama sekali, dengan mengoverride method toString kita bisa mendapatkan string yang lebih deskriptif untuk menggambarkan object tersebut. Misalnya seperti di bawah ini :

public class ToStringTest { public String toString() {

return "ini toString dari class ToStringTest"; }

public static void main(String[] args) { ToStringTest test = new ToStringTest();

System.out.println("implementasi toString dari class Object " + "menghasilkan : " + test);

} }

Hasil eksekusi dari kode di atas akan menghasilkan output seperti di bawah ini : $ javac ToStringTest.java

$ java ToStringTest

implementasi toString dari class Object menghasilkan : ini toString dari class ToStringTest

$

method toString banyak digunakan dalam aplikasi Java, salah satunya adalah menampilkan text di dalam komponen JcomboBox kalau item yang dimasukkan ke dalam JcomboBox adalah class yang kita buat sendiri, bukan tipe data primitif atau class wrapper.

equals dan hashcode

Method equals dan hashCode berperan sangat penting dalam collection. Method equals digunakan untuk membandingkan antara dua buah object apakah sama atau tidak secara logis. Operator == bisa digunakan untuk membandingkan dua buah object, tetapi perbandingan ini

hanya akan menghasilkan true kalau dua buah object apakah berada dalam memory yang sama, atau bisa dikatakan dua buah object ini mempunyai reference yang sama persis. Kalau operator == mengembalikan nilai true berarti dua buah object ini adalah sama persis baik secara alamat memory dan otomatis sama secara logis.

Method equals akan mengembalikan true kalau kedua object sama secara logis walaupun kedua object mempunyai reference berbeda (tidak berada di memory yang sama). Kita ambil contoh sebuah String, dua buah object string akan mengembalikan false jika dioperasikan dengan operator == walaupun string yang ada di dalamnya sama. Tetapi method equals akan mengembalikan nilai true walaupun objectnya berada di memory berbeda asalkan nilai stringnya sama.

Mari kita lihat bagaimana penjelasan di atas kalau dilihat dalam kode. Perhatikan kode berikut ini :

public class EqualsTest {

public static void main(String[] args) { String abc = new String("abc");

String abc1 = new String("abc");

boolean equalsOperator = (abc == abc1);

System.out.println("abc == abc ? " + equalsOperator); boolean equalsMethod = abc.equals(abc1);

System.out.println("abc.equals(abc) ? " + equalsMethod); }

}

apakah output dari kode di atas? Menggunakan operator == maka hasilnya adalah false karena kedua variabel String diinisialisasi dengan menggunakan new String. Sedangkan menggunakan method equals hasilnya adalah true karena kedua variabel mempunyai nilai string yang sama.

$ javac EqualsTest.java $ java EqualsTest

abc == abc ? false abc.equals(abc) ? true $

Kalau ingin membandingkan dua buah object apakah sama secara logis, kita akan menggunakan method equals, tetapi masalahnya adalah implementasi method equals dari class Object sama persis dengan operator ==, sehingga harus dioverride agar walaupun dua buah object yang berbeda tetap dianggap sama asalkan suatu kriteria terpenuhi. Seperti yang terjadi dengan class String dalam contoh di atas, method equalsnya dioverride agar mengembalikan true kalau dua buah object dari class String mempunyai nilai string yang sama.

Misalnya untuk class Customer, dua buah object Customer dianggap sama asalkan idnya sama, oleh karena itu method equals akan dioverride seperti di bawah ini :

public class Customer { private Long id;

public void setId(Long aId){ this.id = aId;

}

public Long getId() { return this.id; }

public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; }

final Customer other = (Customer) obj;

if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) { return false;

}

return true; }

}

Terlihat mengoverride method equals bukan pekerjaan yang gampang, cukup banyak kode yang harus diketik, nantinya menggunakan NetBeans proses pembuatan method equals bisa digenerate secara otomatis, sehingga meminimalisasi kode yang harus diketik manual.

Method hashCode akan mengembalikan nilai integer unik untuk setiap object yang berbeda. Aturanya adalah :

• Method hashCode dari sebuah object harus mengembalikan nilai yang sama walaupun dieksekusi berkali kali selama nilai property dalam object tidak berubah.

• Kalau dua buah object dioperasikan dengan method equals mengembalikan nilai true maka method hashCode dari kedua object harus mengembalikan nilai integer yang sama. Sebaliknya, kalau dua buah object mengembalikan nilai false maka hashCode untuk kedua object akan mengembalikan nilai integer yang berbeda.

• Kalau dua buah object dioperasikan dengan method equals mengembalikan nilai false maka method hashCode tidak harus mengembalikan nilai yang berbeda. Mengembalikan nilai yang sama pun tidak masalah.

Topik bagaimana menghitung nilai hashCode yang baik bisa menjadi topik PhD, tetapi tidak perlu bingung, menggunakan NetBeans kita bisa mengenerate method hashCode ini agar mematuhi aturan di atas. Class Customer menggunakan property id sebagai nilai unik, asal nilai idnya berbeda maka dianggap dua buah object Customer yang berbeda, oleh karena itu nilai hashCode akan dihitung dari id ini. Nah, kode lengkap class Customer setelah method hashCode dioverride adalah seperti di bawah ini :

public class Customer { private Long id;

public void setId(Long aId){ this.id = aId;

}

public Long getId() { return this.id; }

public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; }

final Customer other = (Customer) obj;

if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) { return false;

}

return true; }

public int hashCode() { int hash = 7;

hash = 53 * hash + (this.id != null ? this.id.hashCode() : 0); return hash;

} }

hashCode sangat vital ketika kita menggunakan collection yang memanfaatkan nilai hashCode ini, seperti HashSet atau HashMap. Perhitungan hashCode yang salah akan membuat kedua jenis collection ini berantakan. Kita akan kembali lagi ke topik hashCode ketika membahas kedua collection tersebut di bab berikutnya.

Dalam dokumen c2ed0 java desktop ifnu bima (Halaman 74-77)