Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Nesnelerin 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: Coordinate ve final int x alanlarıyla 2B uzayda bir noktayı temsil eden bir final int y sı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 de hashCode değerini geçersiz kıl. Karma kodunu her iki alandan oluşturmak için Object.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: Coordinate ve y: 5 olan iki ayrı 10 nesnesi oluştur
    • == kullanarak eşit olup olmadıklarını yazdır
    • identical() 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: 3 ve y: 7 olan üçüncü bir koordinat oluştur ve bunu kümeye ekle
    • Kümenin son uzunluğunu yazdır

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
2

Kendin 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
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Dart derleyicisi