Menu
Coddy logo textTech

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 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

Noktaları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 x ve final int y alanlarına sahip, 2D uzayda bir noktayı temsil eden bir Coordinate sı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 de hashCode metodunu geçersiz kılın (override). Her iki alandan karma kodu (hash code) oluşturmak için Object.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: 5 ve y: 10 olan iki ayrı Coordinate nesnesi oluşturun
    • == kullanarak eşit olup olmadıklarını yazdırın
    • identical() kullanarak özdeş (aynı örnek) olup olmadıkları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: 3 ve y: 7 olan üçüncü bir koordinat oluşturun, bunu kümeye ekleyin
    • Kümenin son uzunluğunu yazdırın

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
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