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

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 özelliğini 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 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: 3 ve y: 7 olan üçüncü bir koordinat oluşturun ve 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

Kopya 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ı örnekler

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