Class & Objek
Membuat class, property, method, constructor (singkat, bernama, factory), getter/setter, private dengan underscore, static, dan toString.
Class: cetak biru, objek: barang jadinya
Bayangkan class sebagai cetak biru rumah, dan objek sebagai rumah yang dibangun dari cetak biru itu. Satu class bisa menghasilkan banyak objek, masing-masing dengan datanya sendiri. Ini inti dari pemrograman berorientasi objek (OOP).
class Mahasiswa {
String nama;
int umur;
Mahasiswa(this.nama, this.umur); // constructor
void perkenalan() {
print('Aku $nama, umur $umur tahun.');
}
}
void main() {
var m = Mahasiswa('Budi', 20); // tidak perlu kata new
m.perkenalan();
m.umur = 21;
print(m.nama);
}
Constructor
Mahasiswa(this.nama, this.umur) adalah initializing formal: parameter langsung disalin ke field bernama sama. Ini cara terpendek dan paling umum.
| Jenis | Contoh |
|---|---|
| Biasa | Titik(this.x, this.y); |
| Parameter bernama | Titik({required this.x, this.y = 0}); |
| Bernama (named constructor) | Titik.nol() : x = 0, y = 0; |
| Factory | factory Titik.dariMap(Map m) => Titik(m['x'], m['y']); |
| Const | const Titik(this.x, this.y); (objek konstanta, hemat memori) |
class Titik {
final double x;
final double y;
const Titik(this.x, this.y);
Titik.nol() : x = 0, y = 0; // daftar inisialisasi setelah ":"
factory Titik.dariMap(Map<String, double> m) => Titik(m['x']!, m['y']!);
}
var a = Titik(3, 4);
var asal = Titik.nol();
Field final hanya bisa diisi sekali (lewat constructor). Class dengan field final disebut immutable — pola yang sangat disarankan, terutama di Flutter.
Private: awalan underscore
Dart tidak punya kata private. Nama yang diawali _ bersifat private untuk berkas (library) itu:
class Rekening {
double _saldo = 0; // tidak boleh diakses dari berkas lain
double get saldo => _saldo; // getter: dibaca seperti property
void setor(double jumlah) {
if (jumlah <= 0) throw ArgumentError('Jumlah harus positif');
_saldo += jumlah;
}
}
var r = Rekening();
r.setor(1000);
print(r.saldo); // 1000 (tanpa tanda kurung)
// r.saldo = 5; // ERROR: tidak ada setter
Getter dan setter
class Persegi {
double sisi;
Persegi(this.sisi);
double get luas => sisi * sisi; // dihitung tiap dibaca
set ukuran(double nilai) { // setter dengan validasi
if (nilai > 0) sisi = nilai;
}
}
var p = Persegi(4);
print(p.luas); // 16
p.ukuran = 10;
static: milik class
class Matematika {
static const double pi = 3.14159;
static int hitungPanggilan = 0;
static double luasLingkaran(double r) {
hitungPanggilan++;
return pi * r * r;
}
}
print(Matematika.luasLingkaran(2));
toString dan override
Secara bawaan, mencetak objek menghasilkan Instance of 'Mahasiswa'. Timpa toString agar informatif:
class Mahasiswa {
final String nama;
Mahasiswa(this.nama);
@override
String toString() => 'Mahasiswa($nama)';
}
print(Mahasiswa('Budi')); // Mahasiswa(Budi)
Cascade: beberapa aksi pada satu objek
var m = Mahasiswa('Budi', 20)
..umur = 21
..perkenalan(); // .. = jalankan, tetapi tetap pada objek yang sama
Membandingkan objek
Dua objek berbeda dianggap tidak sama walau isinya sama, kecuali kamu menimpa == dan hashCode (atau memakai record, bab 13).
Error umum
Non-nullable instance field 'nama' must be initialized.→ field tidak diisi di constructor; jadikanrequired, beri default, ataulate.'x' can't be used as a setter because it's final.→ mengubah fieldfinal.The getter '_saldo' isn't defined→ mengakses member private dari berkas lain.