hashCode ve == Override
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 71 / 110.
Varsayılan olarak, Dart'taki iki nesne yalnızca bellekteki tam olarak aynı örneklerse eşittir. Bu, özdeş değerlere sahip iki nesnenin yine de farklı kabul edildiği anlamına gelir:
class Point {
int x, y;
Point(this.x, this.y);
}
void main() {
var p1 = Point(3, 4);
var p2 = Point(3, 4);
print(p1 == p2); // false - farklı örnekler!
}Nesneleri değerlerine göre karşılaştırmak için hem == operatörünü hem de hashCode özelliğini geçersiz kılmanız (override) gerekir. Bu ikisi her zaman birlikte geçersiz kılınmalıdır; eğer iki nesne eşitse, aynı karma koda sahip olmalıdırlar:
class Point {
final int x, y;
Point(this.x, this.y);
@override
bool operator ==(Object other) {
if (other is! Point) return false;
return x == other.x && y == other.y;
}
@override
int get hashCode => Object.hash(x, y);
}
void main() {
var p1 = Point(3, 4);
var p2 = Point(3, 4);
print(p1 == p2); // true - aynı değerler!
}hashCode, Set ve Map anahtarları gibi koleksiyonlar için çok önemlidir. Dart'ın Object.hash() yardımcısı, birden fazla değeri tek bir karma kodda birleştirir. Uygun bir hashCode olmadan, == geçersiz kılınmış olsa bile nesneleriniz karma tabanlı koleksiyonlarda doğru şekilde çalışmayacaktır.
Görev
KolayNoktaların bellek adresleri yerine değerlerine göre karşılaştırılabildiği bir koordinat sistemi oluşturalım! Değer tabanlı eşitliği düzgün bir şekilde uygulayan bir Coordinate sınıfı oluşturacaksınız; bu sınıf, eşitlik kontrolleri ve Set gibi karma tabanlı (hash-based) koleksiyonlarla doğru şekilde çalışacaktır.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
coordinate.dart:final int xvefinal int yalanlarına sahip, 2D uzayda bir noktayı temsil eden birCoordinatesınıfı oluşturun. Aynı x ve y değerlerine sahip iki koordinatın eşit kabul edilmesi için hem==operatörünü hem dehashCodeözelliğini geçersiz kılın (override). Her iki alandan karma kodu (hash code) oluşturmak içinObject.hash()kullanın.main.dart: Koordinat dosyanızı içe aktarın ve değer tabanlı eşitliğin nesne karşılaştırma davranışını nasıl değiştirdiğini gösterin:- Her ikisi de x:
5ve y:10olan iki ayrıCoordinatenesnesi oluşturun. ==kullanarak bunların eşit olup olmadığını yazdırın.identical()kullanarak bunların özdeş (aynı örnek) olup olmadığını yazdırın.- Bir
Set<Coordinate>oluşturun ve her iki koordinatı da buna ekleyin. - Kümenin uzunluğunu yazdırın (eşit oldukları için 1 olmalıdır!).
- x:
3ve y:7olan üçüncü bir koordinat oluşturun ve bunu kümeye ekleyin. - Kümenin son uzunluğunu yazdırın.
- Her ikisi de x:
Bu meydan okuma, hashCode ve == öğelerinin neden her zaman birlikte geçersiz kılınması gerektiğini göstermektedir. Set, öğeleri düzenlemek için karma kodlarını kullanır, bu nedenle uygun bir hashCode olmadan, eşit nesneler bile kopya olarak saklanabilir!
Beklenen çıktı:
true
false
1
2Kopya kağıdı
Varsayılan olarak, Dart'taki iki nesne yalnızca bellekte aynı örneklerse eşittir, aynı değerlere sahiplerse değil:
var p1 = Point(3, 4);
var p2 = Point(3, 4);
print(p1 == p2); // false - farklı örnekler!Nesneleri değerlerine göre karşılaştırmak için hem == operatörünü hem de hashCode'u geçersiz kılın (override). Bunlar her zaman birlikte geçersiz kılınmalıdır:
class Point {
final int x, y;
Point(this.x, this.y);
@override
bool operator ==(Object other) {
if (other is! Point) return false;
return x == other.x && y == other.y;
}
@override
int get hashCode => Object.hash(x, y);
}Birden fazla değeri tek bir karma kodda (hash code) birleştirmek için Object.hash() kullanın. hashCode, Set ve Map gibi koleksiyonlar için kritiktir; o olmadan, eşit nesneler karma tabanlı (hash-based) koleksiyonlarda doğru çalışmaz.
İki nesnenin (sadece eşit değerlere sahip olup olmadığını değil) aynı örnek olup olmadığını kontrol etmek için identical() kullanın:
print(identical(p1, p2)); // false - farklı örneklerKendin dene
import 'coordinate.dart';
void main() {
// TODO: Her ikisi de x: 5 ve y: 10 değerlerine sahip iki ayrı Coordinate nesnesi oluşturun
// TODO: == kullanarak eşit olup olmadıklarını yazdırın
// TODO: identical() kullanarak özdeş (aynı örnek) olup olmadıklarını yazdırın
// TODO: Bir Set<Coordinate> oluşturun ve her iki koordinatı da buna ekleyin
// TODO: Kümenin uzunluğunu yazdırın (eşit oldukları için 1 olmalıdır!)
// TODO: x: 3 ve y: 7 değerlerine sahip üçüncü bir koordinat oluşturun ve kümeye ekleyin
// TODO: Kümenin son uzunluğunu yazdırın
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarKütüphaneler ve ImportlarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarÖrnek DeğişkenleriConstructor TemelleriÖzet - Basit Hesap Makinesi4Null Safety
Null Safety'ye GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Kelimesi ve Null SafetyNull-Aware OperatörleriSınıflarda Null SafetyÖzet - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulama vs. GenişletmeÇoklu ArayüzlerÖzet - Şekil Hesaplayıcı10Koleksiyonlar ve Generic'ler
List, Set, Map Genel BakışTip Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorÖzet - Generic Depolama2Dart'ta Yapıcılar
Varsayılan Yapıcıİsimlendirilmiş Yapıcılarİlklendirme ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Öneki KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DetaylarıBilgi GizlemeÖzet - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Fazla Mixin KullanımıMixin'lerde on Anahtar KelimesiMixin vs KalıtımMixin vs ArayüzÖzet - Hayvan Sistemi11Özel Metotlar
toString() OverridehashCode ve == OverrideComparable Arayüzücall() MetodunoSuchMethod OverrideÖzet - Özel Koleksiyon14Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı17Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakter SistemiAraç Kiralama Servisi3Sınıf Özellikleri
Instance ve Statik ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatik Metotlar ve AlanlarGetters ve SettersÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar KelimesiMetot Ezme@override Anotasyonufinal Sınıf Anahtar KelimesiYapıcı Metotlar ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriInterface'ler ile Çok BiçimlilikÇalışma Zamanı Tip Kontrolüis ve as OperatörleriCovariant Anahtar KelimesiÖzet - Ödeme İşlemcisi12Asenkron OOP
Futures ve async/awaitStream TemelleriStream Controller'larAsenkron KurucularSınıf Metotlarında Asenkron KullanımıÖzet - Data Fetcher15Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı