Dalam Bahasa Pemrograman Dart, modifier sealed
digunakan untuk menciptakan kumpulan subtype yang diketahui seperti enum
namun dalam bentuk class
. Sehingga kita bisa memanfaatkan percabangan (switch) untuk membandingkan antar class
secara statis yang dapat menangani semua subtype secara menyeluruh.
Kelas sealed
didukung dalam berbagai bahasa pemrograman seperti C#, Kotlin, dan sekarang Dart sejak versi 3.
Modifier sealed
tidak dapat dapat diturunkan atau di-implementasikan di luar library-nya sendiri, atau diluar file. Kelas yang sealed
secara implisit bersifat abstrak. Berikut adalah beberapa sifat dari modifier sealed
:
- Tidak memiliki constructor, namun bisa menggunakan factory constructor.
- Dapat menggunakan constructor pada kelas turunannya.
- Turunan kelas yang diberi modifier sealed tidak secara otomatis bersifat abstract. Mereka dapat diinstansiasi secara langsung.
- Kompiler sadar akan setiap kemungkinan yang terjadi pada kelas turunan secara langsung, karena kelas tersebut hanya bisa ada di dalam library yang sama. Ini memungkinkan kompiler memberi peringatan ketika suatu switch tidak menangani secara lengkap semua kelas turunan.
Berikut adalah contoh penggunakan sealed dalam bahasa pemrograman dart:
sealed class Vehicle {}
class Car extends Vehicle {}
class Truck implements Vehicle {}
class Bicycle extends Vehicle {}
// ERROR: Tidak dapat diinstansiasi
Vehicle myVehicle = Vehicle();
// Subkelas bisa diinstansiasi
Vehicle myCar = Car();
String getVehicleSound(Vehicle vehicle) {
// ERROR: `switch` tidak menangani subjenis Bicycle atau kasus default.
return switch (vehicle) {
Car() => 'vroom',
Truck() => 'VROOOOMM',
};
}
Penting untuk diingat bahwa modifier sealed memungkinkan pembuatan hierarki class yang terkontrol, memastikan penanganan semua kelas turunan secara eksplisit dalam kondisi percabangan, serta membatasi perluasan class hanya di dalam library yang sama.
Biasanya, sealed cocok digunakan untuk menangani kasus perbedaan state dalam aplikasi. Apakah dalam kondisi loading, error, success, dan lain sebagainya. Modifier ini bisa diterapkan untuk mendefinisikan kelas state pada state management BloC.
// home_state.dart
sealed class HomeState {}
class LoadingState extends HomeState {}
class LoadedState extends HomeState {
final String data;
LoadedState(this.data);
}
Seperti yang dijelaskan sebelumnya, apabila kita mendefinisikan kelas turunan diluar libray/file dari parent class sealed, maka compiler akan menampilkan pesan error.
//error.dart
import 'home_state.dart';
class ErrorState extends HomeState {
final String error;
ErrorState(this.error);
}
Kita akan mendapatkan pesan error seperi ini:
The class ‘HomeState’ can’t be extended, implemented, or mixed in outside of its library because it’s a sealed class.
Pembatasan ini menghadirkan fitur yang luar biasa yang disebut pattern matching, memungkinkan kita membuat variabel yang bertindak seperti tipe gabungan, dengan masing-masing tipe direpresentasikan sebagai kelas yang memperluas kelas utama (sealed).