Kepada pengunjung Yang Terhormat

Saya harap anda bahagia dengan postingan di Blog ini. anda senang,saya Melayang

Sunday 24 January 2021

equals dan hashcode pada pemrograman Java 7das6da5

 

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

iklan popcash