Dart Sealed Classes

sealed class adalah fitur baru yang diperkenalkan di Dart 3. Secara sederhana, sealed class adalah sebuah kelas abstrak yang memiliki himpunan subclass yang telah ditentukan, dan semua subclass tersebut harus dideklarasikan di dalam library (file .dart) yang sama dengan sealed class itu sendiri.

Tujuan utama dari sealed class adalah untuk membuat hierarki kelas yang “tertutup” atau “terbatas”. Artinya, kita hanya bisa membuat subclass dari kelas sealed di lokasi yang sama dengan kelas tersebut. Ini mencegah developer lain (terutama dari package lain) membuat subclass baru dari kelas sealed Anda.

Kapan menggunakan sealed class? Anda harus menggunakan sealed class saat kita memiliki kelas yang merepresentasikan status atau varian yang terbatas dan saling eksklusif. Contoh klasik adalah status koneksi jaringan atau hasil dari sebuah operasi asinkron.

Keunggulan Utama sealed class

  1. Kontrol Hierarki: kita memegang kendali penuh atas subclass yang diizinkan, mencegah penambahan subclass yang tidak terduga di luar library Anda.
  2. Pengecekan Komprehensif (Exhaustive Checking): Ini adalah fitur yang paling powerful dari sealed class. Ketika kita menggunakan switch atau if pada objek sealed class, Dart akan secara otomatis memeriksa apakah kita telah menangani semua kemungkinan subclass. Jika ada yang terlewat, analyser (bagian dari IDE yang memeriksa kode) akan memberikan peringatan atau error. Ini menjamin kode kita lebih aman dan tidak akan gagal karena kasus yang tidak terduga.
  3. Tidak Perlu Klausa default: Karena Dart tahu bahwa semua subclass sudah tercakup, kita tidak perlu lagi menggunakan klausa default pada switch. Ini membuat kode lebih bersih dan lebih aman.

Contoh Penggunaan Sealed Class

sealed class Vehicle {
  void startEngine() {
    print("Engine started");
  }

  void stopEngine() {
    print("Engine stopped");
  }
}

// Hanya class di file ini yang boleh extends/implements/mixin Vehicle
class Car extends Vehicle {
  @override
  void startEngine() {
    print("Car engine started");
  }
}

class Bike extends Vehicle {
  @override
  void startEngine() {
    print("Bike engine started");
  }
}

void main() {
  var myCar = Car();
  myCar.startEngine();
  myCar.stopEngine();

  var myBike = Bike();
  myBike.startEngine();
  myBike.stopEngine();
}

Jika kita jalankan maka akan seperti berikut

$ dart run SealedClass.dart 
Car engine started
Engine stopped
Bike engine started
Engine stopped

Perbedaan dengan Final dan Interface Class

  • final class: Tidak bisa diwarisi sama sekali.
  • sealed class: Hanya bisa diwarisi di file yang sama.
  • interface class: Hanya bisa diimplementasikan, tidak bisa diinstansiasi langsung.

Sample source code bisa di download di github pada link berikut dart-tutorial

hyvercode

Leave a Reply

Your email address will not be published. Required fields are marked *