hashCode & == Geçersiz Kılma
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 hala 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'u geçersiz kılmanız gerekir. Bu ikisi her zaman birlikte geçersiz kılınmalıdır - eğer iki nesne eşitse, aynı hash koduna 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 çalışmayacaktır.
Görev
KolayNesnelerin 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 doğru şekilde uygulayan bir Coordinate sınıfı oluşturacak ve bunun eşitlik denetimleriyle ve Set gibi karma tabanlı koleksiyonlarla doğru şekilde çalışmasını sağlayacaksın.
Kodunu iki dosyada düzenleyeceksin:
coordinate.dart:Coordinatevefinal int xalanlarıyla 2B uzayda bir noktayı temsil eden birfinal int ysınıfı oluştur. Aynı x ve y değerlerine sahip iki koordinatın eşit kabul edilmesi için hem==operatörünü hem dehashCodedeğerini geçersiz kıl. Karma kodunu her iki alandan oluşturmak içinObject.hash()kullan.main.dart: Koordinat dosyanı içe aktar ve değer tabanlı eşitliğin nesne karşılaştırma davranışını nasıl değiştirdiğini göster:- Her ikisi de x:
Coordinateve y:5olan iki ayrı10nesnesi oluştur ==kullanarak eşit olup olmadıklarını yazdıridentical()kullanarak aynı olup olmadıklarını (aynı örnek olup olmadıklarını) yazdır- Bir
Set<Coordinate>oluştur ve her iki koordinatı buna ekle - Kümenin uzunluğunu yazdır (eşit oldukları için 1 olmalı!)
- x:
3ve y:7olan üçüncü bir koordinat oluştur ve bunu kümeye ekle - Kümenin son uzunluğunu yazdır
- Her ikisi de x:
Bu görev, hashCode ve == operatörlerinin neden her zaman birlikte geçersiz kılınması gerektiğini gösterir. Set, öğeleri düzenlemek için karma kodlarını kullanır; bu nedenle uygun bir hashCode olmadan eşit nesneler bile yinelenen öğeler olarak saklanabilir!
Beklenen çıktı:
true
false
1
2Kendin 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
1Nesne Tabanlı Programlamanın Temelleri
Harici DosyalarKütüphaneler ve İçe AktarmalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar SözcüğüMetotlarÖrnek DeğişkenleriYapıcıların TemelleriTekrar - Basit Hesap Makinesi4Null Güvenliği
Null Güvenliğine GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Sözcüğü ve Null GüvenliğiNull-Aware OperatörlerSınıflarda Null GüvenliğiTekrar - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulamak ve GenişletmekBirden Çok ArayüzTekrar - Şekil Hesaplayıcı10Koleksiyonlar ve Generics
List, Set, Map Genel BakışTür Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorTekrar - Generic Depolama2Dart'ta Yapıcılar
Varsayılan YapıcıAdlandırılmış YapıcılarBaşlatıcı ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Ön Ek KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DerinliğiBilgi GizlemeTekrar - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Çok Mixin KullanımıMixin'lerde on Anahtar SözcüğüMixin ve Kalıtım KarşılaştırmasıMixin ve Arayüz KarşılaştırmasıÖzet - Hayvan Sistemi11Özel Metotlar
toString() Geçersiz KılmahashCode & == Geçersiz KılmaComparable Arayüzücall() MetodunoSuchMethod Geçersiz KılmaÖzet - Özel Koleksiyon14Tasarım Desenleri Bölüm 1
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy Deseni3Sınıf Özellikleri
Örnek ve Static ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatic Metotlar ve AlanlarGetter ve Setter'larÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar SözcüğüMetot Geçersiz Kılma@override Açıklamasıfinal Sınıf Anahtar SözcüğüKurucular ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriArayüzler Yoluyla Çok BiçimlilikÇalışma Zamanı Tür Denetimiis ve as OperatörleriCovariant Anahtar KelimesiTekrar - Ödeme İşlemcisi12Asenkron OOP
Future'ler ve async/awaitStream TemelleriStream DenetleyicileriAsenkron YapıcılarSınıf Metotlarında AsenkronlukÖzet - Veri Getirici15Tasarım Desenleri Bölüm 2
Komut DeseniAdaptör DeseniDekoratör DeseniŞablon Metot DeseniDurum DeseniBileşik DesenDepo DeseniKendi başına pratik yap: Online Dart derleyicisi