equals dan hashcode
pada pemrograman Java 7das6da5
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;
}
}
No comments:
Post a Comment