24 Şubat 2020 Pazartesi

Object.equals metodu

Giriş
Açıklaması şöyle. Eğer bu metod override ediliyorsa, hashCode() metodu da mutlaka override edilmeli.
  • It is reflexive: for any non-null reference value x, x.equals(x) should return true.
  • It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.
  • It is transitive: for any non-null reference values x, y, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true.
  • It is consistent: for any non-null reference values x and y, multiple invocations of x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the objects is modified.
  • For any non-null reference value x, x.equals(null) should return false.
Örnek
Şu satırı dahil ederiz.
import org.apache.commons.lang.builder.EqualsBuilder;
Şöyle yaparız.
class Employee{
  int id;
  ...

  @Override
  public boolean equals(Object obj){      
    return EqualsBuilder.reflectionEquals(this, obj);   
  }
}
Dikkat Edilecek Noktalar

1.  Principle of Least Astonishment
Eğer equals() metodu kafa karışıklığına sebep oluyorsa karışıklığa sebep olan kodu farklı bir metod içine taşımak daha iyi olabilir.

Örnek
Elimizde şöyle bir kod olsun. Burada equals() metodu bir çeşit logic içeriyor görünüyor.
Address a1 = new Address("123","000000-0","John Street","SpringField");
Address a2 = new Address("123","000000-0","John St.","SpringField");
assert a1.equals(a2); // Are abbreviations the same address?
Daha anlaşılır olsun diye şöyle yaparız.
Address a1 = new Address("123","000000-0","John Street","SpringField");
Address a2 = new Address("123","000000-0","John St.","SpringField");

System.out.print(a1.equals(a2)); // false;
System.out.print(a1.isSameLocation(a2)); // true;
Şöyle yaparız.
ector3 v1 = new Vector3(1.000001f, 1.0f, 1.0f);
Vector3 v2 = new Vector3(1.0f, 1.0f, 1.0f);

System.out.print(v1.equals(v2)); // false;
System.out.print(v1.isInRangeOf(v2, 0.01f)); // true;


Hiç yorum yok:

Yorum Gönder