Menu
CoddyTech

Override hashCode & ==

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 71 dari 110.

Secara default, dua object di Dart hanya dianggap sama jika keduanya adalah instance yang persis sama di memori. Artinya, dua object dengan nilai yang identik tetap dianggap berbeda:

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, instansnya berbeda!
}

Untuk membandingkan object berdasarkan nilainya, kamu perlu meng-override operator == dan hashCode. Keduanya harus selalu di-override bersama. Jika dua object sama, keduanya harus memiliki hash code yang sama:

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, nilainya sama!
}

hashCode sangat penting untuk collection seperti Set dan kunci Map. Fungsi bantuan Object.hash() dari Dart menggabungkan beberapa nilai menjadi satu kode hash. Tanpa hashCode yang tepat, object-mu tidak akan berfungsi dengan benar di collection berbasis hash, meskipun == sudah dioverride.

challenge icon

Tantangan

Mudah

Mari kita buat sistem koordinat yang membandingkan titik berdasarkan nilainya, bukan alamat memorinya! Kamu akan membuat class Coordinate yang menerapkan kesetaraan berbasis nilai dengan benar, sehingga class ini berfungsi dengan baik saat memeriksa kesetaraan dan saat digunakan dalam koleksi berbasis hash seperti Set.

Kamu akan menyusun kodemu ke dalam dua file:

  • coordinate.dart: Buat class Coordinate yang merepresentasikan titik dalam ruang 2D dengan field final int x dan final int y. Override operator == dan hashCode agar dua koordinat dengan nilai x dan y yang sama dianggap setara. Gunakan Object.hash() untuk menghasilkan kode hash dari kedua field.
  • main.dart: Impor file koordinatmu dan tunjukkan bagaimana kesetaraan berbasis nilai mengubah perilaku perbandingan object:
    • Buat dua object Coordinate yang terpisah, keduanya dengan x: 5 dan y: 10
    • Cetak apakah keduanya setara menggunakan ==
    • Cetak apakah keduanya identik (instance yang sama) menggunakan identical()
    • Buat Set<Coordinate> dan tambahkan kedua koordinat ke dalamnya
    • Cetak panjang set (seharusnya 1 karena keduanya setara!)
    • Buat koordinat ketiga dengan x: 3 dan y: 7, lalu tambahkan ke set
    • Cetak panjang akhir set

Tantangan ini menunjukkan alasan hashCode dan == harus selalu di-override bersama. Set menggunakan kode hash untuk mengatur elemen, jadi tanpa hashCode yang tepat, object yang setara pun bisa disimpan sebagai duplikat!

Output yang diharapkan:

true
false
1
2

Coba sendiri

import 'coordinate.dart';

void main() {
  // TODO: Buat dua object Coordinate yang terpisah, masing-masing dengan x: 5 dan y: 10

  // TODO: Cetak apakah keduanya bernilai sama menggunakan ==

  // TODO: Cetak apakah keduanya identik (instance yang sama) menggunakan identical()

  // TODO: Buat Set<Coordinate> dan tambahkan kedua koordinat ke dalamnya

  // TODO: Cetak jumlah elemen dalam set (seharusnya 1 karena keduanya bernilai sama!)

  // TODO: Buat koordinat ketiga dengan x: 3 dan y: 7, lalu tambahkan ke set

  // TODO: Cetak jumlah akhir elemen dalam set
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Dart online