Class & Objek

Membuat class, property, method, constructor (singkat, bernama, factory), getter/setter, private dengan underscore, static, dan toString.

Part 9 dari 20 ± 60 menit Gratis

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.

JenisContoh
BiasaTitik(this.x, this.y);
Parameter bernamaTitik({required this.x, this.y = 0});
Bernama (named constructor)Titik.nol() : x = 0, y = 0;
Factoryfactory Titik.dariMap(Map m) => Titik(m['x'], m['y']);
Constconst 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; jadikan required, beri default, atau late.
  • 'x' can't be used as a setter because it's final. → mengubah field final.
  • The getter '_saldo' isn't defined → mengakses member private dari berkas lain.

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X