Dart Final Classes

final class adalah fitur di Dart yang digunakan untuk mencegah class tersebut diwarisi (extends) atau diimplementasikan (implements) oleh class lain. Artinya, class yang dideklarasikan dengan kata kunci final hanya bisa digunakan secara langsung, tidak bisa menjadi parent class

Buat file dengan nama FinalClass.dart

final class vehile {
  void startEngine() {
    print("Engine started");
  }

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

// Extending the final class error canont be extended
class Car extends vehile {
  @override
  void startEngine() {
    super.startEngine();
  }

  @override
  void stopEngine() {
    super.stopEngine();
  }
}

// Impelement the final class error canont be extended
class Bike implements vehile {
  @override
  void startEngine() {
    print("Bike engine started");
  }

  @override
  void stopEngine() {
    print("Bike engine stopped");
  }
}

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

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

Ketika kita jalankan maka akan terjadi error seperti berikut :

$ dart run FinalClass.dart 
FinalClass.dart:12:7: Error: The type 'Car' must be 'base', 'final' or 'sealed' because the supertype 'vehile' is 'final'.
Try adding 'base', 'final', or 'sealed' to the type.
class Car extends vehile {
      ^
FinalClass.dart:25:7: Error: The type 'Bike' must be 'base', 'final' or 'sealed' because the supertype 'vehile' is 'final'.
Try adding 'base', 'final', or 'sealed' to the type.
class Bike implements vehile {

Penjelasan Kode: Interface Class di Dart

Pada contoh di atas, vehile adalah sebuah final class.

Kenapa Terjadi Error?

1. Mencoba Extends Final Class, Kode di atas akan error karena vehile adalah final class, sehingga tidak boleh diwarisi oleh class lain.

2. Mencoba Implements Final Class, Begitu juga saat mencoba mengimplementasikan final class.

Tujuan Final Class

  • Keamanan kode: Mencegah perubahan perilaku class yang tidak diinginkan melalui pewarisan.
  • Optimasi: Compiler bisa melakukan optimasi lebih baik karena tahu class tersebut tidak akan diwarisi.
  • Desain API: Cocok untuk class yang memang tidak boleh diubah perilakunya oleh developer lain.

Kesimpulan

  • Gunakan final class jika ingin membuat class yang tidak boleh diwarisi atau diimplementasikan.
  • Jika mencoba mewarisi atau mengimplementasikan final class, akan muncul error dari Dart.

Untuk memanggil atau menggunakan final class di Dart, kita tidak bisa mewarisi (extends) atau mengimplementasikan (implements) class tersebut.
Namun, kita tetap bisa membuat objek langsung dari final class dan memanggil method-method yang ada di dalamnya.

Contoh Penggunaan Final Class

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

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

void main() {
  var myVehicle = Vehicle(); // Membuat objek langsung dari final class
  myVehicle.startEngine();   // Memanggil method
  myVehicle.stopEngine();
}

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

hyvercode