Home Coding Generics pada Bahasa Pemrograman Dart

Generics pada Bahasa Pemrograman Dart

0
Generics pada Bahasa Pemrograman Dart

Assalamu’alaikum warahmatullahi wabarakatuh.

Bismillahirrahmanirrahim, Allahumma Shalli ‘alaa Muhammad, Wa ‘alaa aalii Muhammad.

Apa Kabar teman-teman? Semoga selalu sehat dan dalam lindungan Allah SWT. Dalam postingan ini, saya akan mencoba menjelaskan apa itu generics pada Dart, dan apa fungsinya serta kapan menggunakannya.

Generics, pada dasarnya adalah konsep untuk membuat suatu function, method, atau class agar bisa digunakan ulang untuk beberapa tipe data. Tipe data ini nantinya akan ditentukan ketika pemanggilan function, method, atau class generic ini, sehingga tetap memastikan Type-Safety pada kode kita selagi memberi keleluasaan untuk menggunakan ulang functions atau method2 yang ada pada suatu class untuk berbagai tipe data.

Penggunaan paling umum dan paling jelas dari generics mulai bagi beginner sampai expert programmer adalah penggunaan pada library collection. Contohnya saja List. Ketika menggunakan list, biasanya kita mendefinisikan jenis List tersebut, contohnya List<String> atau List<int>. Ini berguna untuk mendefinisikan tipe apa yang akan diterima sebagai elemen list tersebut. Ketika kita tidak mendefinisikannya, secara tidak langsung Dart menganggap tipe list tersebut sebagai List<dynamic>.

Dengan demikian, kita bisa menggunakan method-method atau properti pada kelas List atau Collection lainnya untuk berbagai tipe data, seperti misalnya .add(), .sort(), remove() , .length, .first, .last dan masih banyak lagi. Selain class, kita juga bisa mendefinisikan generic pada function dan method. Ini berguna agar kita tidak berulang-ulang membuat function atau method untuk tugas yang sama namun tipe data berbeda. Berikut ini contoh List dengan generic.

void main() {
  List<int> listInteger = [1,2,3,4,5,6,7,8,9,10];
  listInteger.forEach((e) => print(e));
  
  List<String> listString = ['a','b','c','d','e'];
  listString.forEach((e) => print(e));
  
  print("Panjang listInteger adalah : ${listInteger.length}");
  print("Panjang listString adalah : ${listString.length}");
}

Generic bukan hanya dapat digunakan untuk collection. Berikut ini akan saya beri contoh kasus bagaimana dan kapan saat menggunakan generic. Sekarang anggaplah kita ingin membuat sebuah class BrankasInteger, yang bisa menyimpan suatu nilai integer, dimana nilai dari integer yang disimpan dalam brankas tersebut bisa di akses jika user bisa memberi inputan nomor pin yang benar, maka kodenya akan seperi berikut :

class BrankasInteger{
  BrankasInteger(this.nomorPin,this.nilaiInteger);
  String nomorPin;
  int nilaiInteger;
  
  int ambilNilaiInteger(String nomorPin){
    if(nomorPin == this.nomorPin){
      return this.nilaiInteger;
    }
    return null;
  }
}

void main() {
  var brankas1 = BrankasInteger("123",123);
  
  print(brankas1.ambilNilaiInteger("123"));
}

Lalu muncul pertanyaan, bagaimana jika kita memerlukan brankas yang menyimpan nilai String? Kita bisa saja menulis kembali class brankas tersebut sebagai berikut.

class BrankasString{
  BrankasString(this.nomorPin,this.nilaiString);
  String nomorPin;
  String nilaiString;
  
  String ambilNilaiString(String nomorPin){
    if(nomorPin == this.nomorPin){
      return this.nilaiString;
    }
    return null;
  }
}

void main() {
  var brankas1 = BrankasString("123","Ini String Rahasianya");
  
  print(brankas1.ambilNilaiString("123"));
}

Mudah bukan? Tapi jika kita perhatikan, kita melakukan pengulangan penulisan kode disini. apakah tidak bisa kita buat satu kelas brankas saja, untuk semua jenis tipe data? Disinilah generic bisa berguna. Tapi kenapa tidak kita buat saja field class nya dynamic? Karena jika dynamic, itu artinya brankas tersebut bisa menerima nilai dengan tipe data apapun sekaligus, sedangkan generic, tipe datanya ditetapkan ketika pemanggilan/intansiasi kelas tersebut. Begini contohnya.

class Brankas<T>{
  Brankas(this.nomorPin,this.nilaiRahasia);
  String nomorPin;
  T nilaiRahasia;
  
  T ambilNilai(String nomorPin){
    if(nomorPin == this.nomorPin){
      return this.nilaiRahasia;
    }
    return null;
  }
}

void main() {
  var brankas1 = Brankas<String>("123","Ini String Rahasianya");
  var brankas2 = Brankas<int>("456",767676);
  
  print(brankas1.ambilNilai("123")); //return "Ini String Rahasianya"
  print(brankas1.ambilNilai("321")); //return null
  print(brankas2.ambilNilai("456")); //return 767676
}

Perlu diperhatikan disini, untuk mendeklarasikan bahwa sebuah Class adalah class generic, kita menambahkan “<T>” setelah nama kelas. ‘T’ ini sebenarnya tidak harus ‘T’, kita bisa menukarnya dengan huruf atau bahkan susunan karakter lainnya, akan tetapi pada umumnya untuk penggunaan generic pada class menggunakan satu huruf saja seperti itu.

Lalu hal lain yang perlu diperhatikan adalah, dikarenakan salah satu field class itu dinyatakan sebagai generic, maka tipe datanya dituliskan sebagai ‘T’ (field nilaiRahasia), dan field ini akan bertipe data sesuai dengan yang dinyatakan saat instansiasi.

Selain dari setelah nama class dan parameter function/method, generic juga dapat dituliskan sebagai return type suatu function/method, seperti pada method ‘ambilNilai()’.

Mungkin sekian yang bisa saya sampaikan untuk kesempatan kali ini. Semoga bermanfaat bagi teman-teman. Wassalamu’alaikum warahmatullahi wabarakatuh.