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.
Tantangan
MudahMari 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 classCoordinateyang merepresentasikan titik dalam ruang 2D dengan fieldfinal int xdanfinal int y. Override operator==danhashCodeagar dua koordinat dengan nilai x dan y yang sama dianggap setara. GunakanObject.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
Coordinateyang terpisah, keduanya dengan x:5dan 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:
3dan y:7, lalu tambahkan ke set - Cetak panjang akhir set
- Buat dua object
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
2Coba 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
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
file Eksternallibrary dan ImporPengantar OOPClass dan ObjectKata kunci thismethodVariabel InstanceDasar-Dasar ConstructorRingkasan: Kalkulator Sederhana4Keamanan Null
Pengantar Keamanan NullBisa Null vs Tidak Bisa NullOperator ? dan !Kata Kunci late dan Keamanan NullOperator Penanganan NullKeamanan Null dalam classRangkuman: Sistem Profil Pengguna7class Abstrak & Antarmuka
class AbstrakMethod abstrakAntarmuka di DartAntarmuka ImplisitMengimplementasikan vs MemperluasBeberapa AntarmukaRingkasan: Kalkulator Bentuk10Koleksi dan Generik
Gambaran Umum list, set, dan MapKoleksi dengan Tipe AmanKelas GenerikMetode GenerikBatasan GenerikIterable dan IteratorUlasan: Penyimpanan Generik2Konstruktor dalam Dart
Konstruktor DefaultKonstruktor BernamaInitializer ListsKonstruktor KonstanKonstruktor FactoryKonstruktor RedirectingRangkuman, Pembuat Bentuk5Enkapsulasi
Member Publik vs PrivatKonvensi Prefiks _Privasi Tingkat libraryPendalaman Getter & SetterPenyembunyian InformasiRingkasan: Catatan Siswa8Mixin
Pengantar MixinMembuat MixinMenggunakan Beberapa MixinKata Kunci on pada MixinMixin vs. PewarisanMixin vs. InterfaceRangkuman: Sistem Hewan11Metode Khusus
Override toString()Override hashCode & ==Antarmuka Comparablecall() methodOverride noSuchMethodRingkasan: Koleksi Kustom3Property Class
Anggota Instance vs StaticField Final dan ConstVariabel LateMethod dan Field StaticGetter dan SetterRangkuman: Pengelola Rekening Bank6Pewarisan
Pewarisan DasarKata Kunci superPenimpaan methodAnotasi @overrideKata Kunci class finalKonstruktor dan PewarisanRangkuman, Hierarki Karyawan9Polimorfisme
Dasar-Dasar PolimorfismePolimorfisme melalui AntarmukaPemeriksaan Tipe saat RuntimeOperator is & asKata Kunci KovarianRangkuman: Pemroses PembayaranLatihan sendiri: Compiler Dart online