Operator pemeriksaan tipe Dart

Ringkasan tiga operator (as /is/is!)

OperatorKeterangan fungsi
asKonversi tipe paksa; juga digunakan untuk memberikan alias pustaka
isPemeriksaan tipe: mengembalikan true jika objek termasuk tipe yang ditentukan
is!Pemeriksaan tipe: mengembalikan true jika objek bukan tipe yang ditentukan

Syarat agar obj is T bernilai benar: objek obj mengimplementasikan atau mewarisi tipe T (termasuk kelas induk, antarmuka dan tipe nullable).

Contoh: Objek apapun is Object? selalu bernilai true.

Operator is

Pemeriksaan tipe yang aman

Memeriksa tipe objek saat runtime; jika hasilnya true, di dalam blok kode Anda bisa langsung gunakan objek sebagai tipe tersebut tanpa konversi manual. Jika objek bernilai null atau tipe tidak cocok, akan mengembalikan false tanpa memunculkan pengecualian.

Contoh di bawah menggunakan objek kelas. Jika Anda belum mempelajari kelas, anggap saja kelas sebagai cetakan untuk membuat data.

class Person {
  String firstName = '';
}

class Employee extends Person {}

void main() {
  dynamic employee = Employee();

  // Pemeriksaan tipe dengan is
  if (employee is Person) {
    // Setelah masuk cabang, employee otomatis dikenali sebagai tipe Person
    employee.firstName = "Jack";
    print(employee.firstName); // Menampilkan Jack
  }

  dynamic emptyObj = null;
  if (emptyObj is Person) {
    // Tidak akan dijalankan, null tidak cocok dengan Person
    print("Cocok");
  }
}Code language: Dart (dart)

Kode di atas mendefinisikan kelas Person lalu kelas Employee yang mewarisi Person.

Dalam kode, is dipakai untuk cek apakah objek bertipe Person. Jika benar, Anda bisa pakai langsung sebagai Person di dalam blok {}. Hal ini karena kita menggunakan tipe dinamis pada dynamic employee = Employee();.

Pada contoh kedua dynamic emptyObj = null;, nilainya null sehingga emptyObj is Person bernilai false dan kode di dalam {} tidak dijalankan.

Operator is!

Pemeriksaan tipe terbalik

Sintaks:

variabel is! tipe

Sebenarnya sama dengan hasil operator is yang dinegasikan.

Sama dengan !(variabel is tipe), berfungsi mengecek bahwa objek bukan tipe target.

Lihat contoh berikut:

class Person {
  String name = '';
}

void main() {
  dynamic obj = "teks";
  if (obj is! Person) {
    print("obj bukan tipe Person");
  }
}Code language: Dart (dart)

Contoh di atas akan menjalankan kode di blok dan mencetak “obj bukan tipe Person”, karena obj bukan instance yang dibuat dari cetakan Person.

Operator as

Konversi tipe paksa

Cara pakai:

(variabel as tipeTarget).properti/methodCode language: JavaScript (javascript)

Gunakan hanya jika Anda 100% yakin objek tersebut adalah tipe target, jika tidak akan muncul pengecualian runtime. Demi ketahanan program, tidak disarankan pakai secara berlebihan.

class Teacher {
  String name = '';
}

void main() {
  dynamic jason = Teacher();
  // Paksa ubah ke Teacher untuk akses properti
  (jason as Teacher).name = "Jason";
  print((jason as Teacher).name); // Jason
}Code language: Dart (dart)

Hasil output contoh di atas adalah Jason

Kita langsung buat objek Teacher dengan dynamic jason = Teacher();, jadi bisa jamin 100% bahwa ia tipe Teacher sehingga tidak ada error saat pakai cara ini.

Jika tulis kode seperti di bawah, akan muncul error.

class Teacher {
  String name = '';
}

class Car {
  String name = '';
}

void main() {
  dynamic jason = Teacher();
  
  // Paksa ubah ke Car untuk akses properti
  (jason as Car).name = "Jason";//❌error
  print((jason as Car).name); //❌error
}Code language: Dart (dart)

Error muncul karena jason awalnya objek tipe Teacher tapi kita paksa konversi ke tipe Car.

D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
Unhandled exception:
type 'Teacher' is not a subtype of type 'Car' in type cast
#0      main (file:///D:/dartdemo/firstdart/bin/firstdart.dart:12:10)
#1      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:314:19)
#2      _RawReceivePort._handleMessage (dart:isolate-patch/isolate-patch.dart:193:12)Code language: PHP (php)

Perbandingan inti as dan is

// Cara 1: Konversi paksa pakai as
(employee as Person).firstName = 'Bob';

// Cara 2: Cek dulu pakai is baru pakai objek
if (employee is Person) {
  employee.firstName = 'Bob';
}Code language: JavaScript (javascript)

Perilaku ketika employee bernilai null atau bukan tipe Person:

  • Versi as: Akan memunculkan pengecualian CastError dan program berhenti;
  • Versi is: Tidak masuk cabang if, tidak ada error dan tidak menjalankan apapun.

Meskipun kodenya sedikit lebih panjang, prioritaskan pakai metode is agar program lebih tangguh.

Kegunaan kedua as

Kegunaan kedua as

as tidak hanya untuk konversi tipe: saat import pustaka bisa dipakai untuk memberi alias pustaka

import 'dart:math' as math;

void main() {
  // Panggil kelas/method melalui alias pustaka
  print(math.pi); // Menampilkan 3.141592653589793
}Code language: JavaScript (javascript)

Contoh lengkap akhir

class Animal {}
class Cat extends Animal {}

void main() {
  dynamic obj = Cat();

  // 1. Cek dengan is
  if (obj is Animal) {
    print("obj bertipe Animal");
  }

  // 2. Cek terbalik pakai is!
  if (obj is! String) {
    print("obj bukan string");
  }

  // 3. Konversi paksa pakai as
  Animal a = obj as Animal;

  // Contoh salah yang menyebabkan program crash
  dynamic str = "hello";
  // Animal error = str as Animal; // Memunculkan CastError
}Code language: JavaScript (javascript)

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *