2015-12-28 7 views
14

Java'da tuple benzeri bir yapıya izin veren bir tuple sınıfı oluşturmaya çalışıyorum. Tuple'da iki elemanın genel tipi sırasıyla X ve Y'dir. Bu sınıf için doğru bir eşitliği geçersiz kılmaya çalışıyorum.Objects.equals ve Object.equals

Şey "==" Ben Object.Equals hala gibi referanslara dayalı karşılaştırır o varsayılan düşer biliyoruz, bu yüzden bunu kullanabilirsiniz kadar emin değilim. Objects'e baktım ve içinde bir eşittir() var. Bu hala referanslarda karşılaştırılıyor mu yoksa içeriklerle karşılaştırılıyor mu?

return Objects.equals(compared.prev, this.prev) && Objects.equals(compared.next, this.next); 

önceki ve sonraki başlığın unsurlardır:

Hızla gibi bir şey olarak return ifadesini hayal etti. Bu işe yarar mı?

+2

Yerleşik JRE sınıfları için kaynak kodunu okuyabilirsiniz. – chrylis

cevap

27

fark Objects.equals() "eşit" olarak iki boş değerlere irdelemektedir. sözde kodu:

  1. her iki parametre null dönüş ise true
  2. tam olarak bir parametre null dönüş false
  3. dönüş o ikinci parametre
  4. geçen birinci parametrenin equals() metodu çağırarak, bir sonucu olup olmadığını

Bu davranış o "boş güvenli" olduğu anlamına gelir.

+0

Nokta 2 yanlış belgelenmiştir. Kod şöyledir: 'return (a == b) || (a! = null && a.equals (b)); 'bu yüzden aslında * eğer ** ilk ** parametresi' null' 'false' döndürüyorsa *. İkincisi "null" ise, 'equals'ınız' null' parametresiyle çağrılır. "Eşit" inizi yanlış uyguladıysanız, "Benim gibi." –

0

Objects.equals yalnızca ilk argümanlar .equals yöntemini çağırır. Java'da, yaptığınız bir sınıfın örneklerinde eşitliği test edebilmek istiyorsanız, eşitlik yöntemini geçersiz kılmanız gerekir. instance.equals() yalnızca == kullanırsa, bu türler eşittir yöntemini geçersiz kılmaz.

+1

Ayrıca "hashCode" – Robert

+2

Hayır geçersiz kılmayın, bunu yapmaz. – Bohemian

İlgili konular