Kendi anahtar çifti nesnenizi oluşturduğunuzda, birkaç şeyle karşılaşmalısınız.
Öncelikle, uygulamanın bilmelidir hashCode()
ve equals()
. Bunu yapmanız gerekecek.
İkincisi, uygularken hashCode()
nasıl çalıştığını anladığınızdan emin olun. Verilen kullanıcı örneği
public int hashCode() {
return this.x ^ this.y;
}
aslında yapabileceğiniz en kötü uygulamalardan biridir. Nedeni basit: çok sayıda eşit karmaya sahipsiniz! Ve hashCode()
en iyi ihtimalle nadir, benzersiz olma eğiliminde olan int değerleri döndürmelidir. Bunun gibi bir şey kullanın:
public int hashCode() {
return (X << 16) + Y;
}
Bu hızlıdır ve -2 ^ 16 ile 2 ^ 16-1 (-65536 ile 65535) arasındaki anahtarlar için benzersiz karmalar döndürür. Bu hemen hemen her duruma uyar. Çok nadiren bu sınırların dışına çıkarsınız.
Üçüncüsü, uygularken equals()
ne için kullanıldığını da bilin ve nesneler oldukları için anahtarlarınızı nasıl yarattığınızın farkında olun. Çoğunlukla gereksiz şeyler yaparsınız, eğer ifadeler neden olursa her zaman aynı sonucu alırsınız.
Bunun gibi anahtarlar oluşturursanız: anahtarlarınızın map.put(new Key(x,y),V);
referanslarını asla karşılaştırmazsınız. Çünkü haritaya her erişmek istediğinizde, buna benzer bir şey yapacaksınız map.get(new Key(x,y));
. Dolayısıyla sizin equals()
gibi bir ifadeye ihtiyaç duymaz if (this == obj)
. Asla olmayacak .
Yerine if (getClass() != obj.getClass())
senin içinde equals()
daha iyi kullanılması if (!(obj instanceof this))
. Alt sınıflar için bile geçerli olacaktır.
Yani karşılaştırmanız gereken tek şey aslında X ve Y'dir. Yani equals()
bu durumda en iyi uygulama şöyle olacaktır:
public boolean equals (final Object O) {
if (!(O instanceof Key)) return false;
if (((Key) O).X != X) return false;
if (((Key) O).Y != Y) return false;
return true;
}
Sonuçta anahtar sınıfınız şu şekildedir:
public class Key {
public final int X;
public final int Y;
public Key(final int X, final int Y) {
this.X = X;
this.Y = Y;
}
public boolean equals (final Object O) {
if (!(O instanceof Key)) return false;
if (((Key) O).X != X) return false;
if (((Key) O).Y != Y) return false;
return true;
}
public int hashCode() {
return (X << 16) + Y;
}
}
Nihai olmaları ve hassas bilgiler içermemeleri nedeniyle boyut endekslerinize X
ve Y
bir genel erişim seviyesi verebilirsiniz . Emin olsun% 100 değilim private
erişim seviyesi düzgün çalışır herhangi döküm yaparken durumda Object
a Key
.
Finalleri merak ediyorsanız, değerin örneklemede belirlenen ve asla değişmeyen - ve bu nedenle bir nesne sabit olduğu - her şeyi nihai olarak beyan ederim.