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
- Kontrol Hierarki: kita memegang kendali penuh atas subclass yang diizinkan, mencegah penambahan subclass yang tidak terduga di luar library Anda.
- Pengecekan Komprehensif (Exhaustive Checking): Ini adalah fitur yang paling powerful dari
sealed class
. Ketika kita menggunakanswitch
atauif
pada objeksealed 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. - Tidak Perlu Klausa
default
: Karena Dart tahu bahwa semua subclass sudah tercakup, kita tidak perlu lagi menggunakan klausadefault
padaswitch
. 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