Menu
CoddyTech

Sealed class (Dart 3)

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 85 dari 110.

Dart 3 memperkenalkan sealed classes, yang membatasi class mana saja yang dapat memperluas atau mengimplementasikannya. Saat kamu menandai sebuah class sebagai sealed, hanya class dalam file yang sama yang dapat menjadi subtipe langsungnya. Ini membentuk himpunan tertutup dari subtipe yang diketahui.

sealed class Result {}

class Success extends Result {
  final String data;
  Success(this.data);
}

class Failure extends Result {
  final String error;
  Failure(this.error);
}

Kekuatan sealed class berasal dari pemeriksaan kelengkapan. Saat kamu menggunakan percabangan pada tipe sealed, compiler mengetahui semua subtype yang mungkin dan memastikan kamu menangani setiap subtype:

String handleResult(Result result) {
  return switch (result) {
    Success(data: var d) => 'Got: $d',
    Failure(error: var e) => 'Error: $e',
  };
  // Tidak perlu default, compiler tahu semua kasus sudah tercakup!
}

void main() {
  var success = Success('Hello');
  var failure = Failure('Not found');
  
  print(handleResult(success));  // Got: Hello
  print(handleResult(failure));  // Error: Not found
}

Jika kamu menambahkan subtype baru ke sealed class, compiler akan menandai setiap pernyataan switch yang tidak menanganinya. Hal ini membuat sealed class ideal untuk memodelkan status, hasil, atau skenario apa pun yang memiliki sekumpulan varian tetap. Berbeda dengan abstract class, sealed class menjamin bahwa tidak ada kode eksternal yang dapat menambahkan subtype tak terduga.

challenge icon

Tantangan

Mudah

Mari kita buat penangan permintaan jaringan menggunakan sealed class! Kamu akan membuat sistem bertipe aman yang memodelkan berbagai status respons jaringan, sehingga setiap kemungkinan hasil ditangani dengan benar.

Kamu akan mengatur kodemu ke dalam dua file:

  • response.dart: Buat hierarki sealed class yang mewakili semua kemungkinan status respons jaringan:
    • Sealed class bernama NetworkResponse yang menjadi dasar bagi semua tipe respons
    • Class Loading yang memperluas NetworkResponse dengan field String message (misalnya, "Fetching data...")
    • Class Success yang memperluas NetworkResponse dengan field String data dan field int statusCode
    • Class Error yang memperluas NetworkResponse dengan field String errorMessage dan field int errorCode
  • main.dart: Impor file responsmu dan buat fungsi yang menangani semua tipe respons menggunakan ekspresi switch:
    • Buat fungsi handleResponse(NetworkResponse response) yang mengembalikan String
    • Gunakan ekspresi switch dengan pencocokan pola untuk menangani setiap kasus:
      • Untuk Loading: kembalikan Status: [message]
      • Untuk Success: kembalikan Success ([statusCode]): [data]
      • Untuk Error: kembalikan Error ([errorCode]): [errorMessage]
    • Buat tiga instance respons dan cetak hasil penanganan masing-masing:
      • Loading dengan pesan Please wait...
      • Success dengan data User profile loaded dan kode status 200
      • Error dengan pesan error Not found dan kode error 404

Keunggulan sealed class adalah compiler memastikan kamu menangani setiap kemungkinan tipe respons, jadi kamu tidak memerlukan kasus default!

Output yang diharapkan:

Status: Please wait...
Success (200): User profile loaded
Error (404): Not found

Coba sendiri

import 'response.dart';

// TODO: Buat fungsi handleResponse(NetworkResponse response)
// yang mengembalikan String
// Gunakan ekspresi switch dengan pencocokan pola untuk menangani setiap kasus:
// - Untuk Loading: kembalikan "Status: [message]"
// - Untuk Success: kembalikan "Success ([statusCode]): [data]"
// - Untuk Error: kembalikan "Error ([errorCode]): [errorMessage]"

void main() {
  // TODO: Buat instance Loading dengan message "Please wait..."
  
  // TODO: Buat instance Success dengan data "User profile loaded" dan kode status 200
  
  // TODO: Buat instance Error dengan errorMessage "Not found" dan errorCode 404
  
  // TODO: Cetak hasil penanganan setiap respons
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Dart online