Setiap nilai yang disimpan dalam program Dart memiliki tipe, dan setiap variabel menyimpan nilai dengan satu tipe yang diketahui sejak kode ditulis. Topik ini membahas empat cara mendeklarasikan variabel, yaitu deklarasi var, final, dan const beserta anotasi tipe eksplisit, lalu membandingkan inferensi tipe (type inference) dengan penulisan tipe secara manual. Setelah membaca topik ini, deklarasi yang tepat untuk setiap situasi dapat dipilih, dan pesan error yang dihasilkan analyzer, yaitu alat pemeriksaan statis bawaan Dart, dapat ditafsirkan dengan yakin.
Deklarasi dengan var dan inferensi tipe#
Kata kunci var mendeklarasikan variabel tanpa penulisan tipe secara langsung. Dart menyimpulkan tipenya dari nilai awal yang diberikan, dan mekanisme penyimpangan ini disebut inferensi tipe (type inference). Prosesnya terjadi saat kode dianalisis, bukan saat program berjalan, sehingga tipe yang disimpulkan tetap diperiksa secara statis seperti tipe yang ditulis manual. Contoh berikut memperlihatkan penyimpangan tersebut beserta tipe hasilnya.
void main() {
var jumlahPendaftar = 24;
var namaKegiatan = 'Lomba Pemrograman';
print('$namaKegiatan diikuti $jumlahPendaftar orang');
print('Tipe jumlahPendaftar: ${jumlahPendaftar.runtimeType}');
print('Tipe namaKegiatan: ${namaKegiatan.runtimeType}');
}Lomba Pemrograman diikuti 24 orang
Tipe jumlahPendaftar: int
Tipe namaKegiatan: StringProperti runtimeType menampilkan tipe aktual dari nilai yang disimpan, dan keluarannya menegaskan bahwa jumlahPendaftar bertipe int, sedangkan namaKegiatan bertipe String. Tipe yang sudah disimpulkan tidak berubah lagi. Apabila nilai bertipe lain ditugaskan ke variabel tersebut, analyzer menolaknya sebelum program sempat dijalankan, sebagaimana ditunjukkan blok berikut.
# buat berkas dengan penugasan tipe yang salah, lalu jalankan dart analyze
rm -rf /tmp/uji/variabel-dan-tipe-salah && mkdir -p /tmp/uji/variabel-dan-tipe-salah
cat > /tmp/uji/variabel-dan-tipe-salah/salah_tipe.dart <<'EOF'
void main() {
var jumlahPendaftar = 24;
jumlahPendaftar = 'banyak';
print(jumlahPendaftar);
}
EOF
cd /tmp/uji/variabel-dan-tipe-salah && dart analyzeAnalyzing variabel-dan-tipe-salah...
error - salah_tipe.dart:3:21 - A value of type 'String' can't be assigned to a variable of type 'int'. Try changing the type of the variable, or casting the right-hand type to 'int'. - invalid_assignment
1 issue found.Pesan error menyatakan bahwa nilai bertipe String tidak dapat ditugaskan ke variabel bertipe int. Temuan semacam ini memperlihatkan sifat inferensi yang sering disalahpahami, yaitu var bukan berarti tipe bebas. Variabel var tetap memiliki satu tipe tetap, hanya saja penulisannya didelegasikan kepada compiler sehingga tidak terlihat di kode.
Anotasi tipe eksplisit#
Anotasi eksplisit menuliskan tipe sebelum nama variabel, misalnya int, double, String, atau bool. Bentuk ini menuntut penulis mengetahui tipenya, tetapi memberi dua keuntungan. Pertama, maksud kode terbaca langsung tanpa perlu menelusuri nilai awalnya. Kedua, anotasi menjadi pilihan yang tepat apabila variabel dideklarasikan tanpa nilai awal, karena var tanpa nilai awal menghasilkan tipe dynamic, yaitu tipe yang melemahkan pemeriksaan statis. Contoh berikut mendeklarasikan empat variabel dengan tipe yang ditulis manual.
void main() {
int jumlahPertemuan = 12;
double rataRataKelas = 87.5;
String judulMataKuliah = 'Statistika Dasar';
bool pendaftaranDibuka = true;
print('$judulMataKuliah: $jumlahPertemuan pertemuan');
print('Rata-rata: $rataRataKelas');
print('Pendaftaran dibuka: $pendaftaranDibuka');
}Statistika Dasar: 12 pertemuan
Rata-rata: 87.5
Pendaftaran dibuka: trueKeluaran menunjukkan bahwa perilaku program dengan anotasi eksplisit sama persis dengan versi var, karena keduanya menghasilkan variabel dengan tipe yang sama. Pemilihan di antara keduanya menjadi soal keterbacaan dan konteks. Pada deklarasi yang nilai awalnya jelas, var membuat kode lebih ringkas, sedangkan pada deklarasi yang tipenya perlu ditegaskan atau nilai awalnya belum ada, anotasi eksplisit menjaga tipe tetap tercatat. Anotasi juga mencegah penyimpulan yang sah tetapi menyimpang dari maksud, misalnya var berat = 64 menyimpulkan int padahal berat badan lazimnya pecahan, sehingga penulisan double berat = 64.2 menyatakan maksud itu sejak deklarasi.
final untuk nilai sekali isi dan const untuk konstanta#
Kata kunci final mendeklarasikan variabel yang hanya dapat diisi satu kali. Nilainya boleh dihitung saat program berjalan, tetapi setelah terisi, penugasan berikutnya ditolak analyzer. Kata kunci const lebih tegas lagi, karena nilai yang disimpan harus sudah diketahui sejak waktu kompilasi (compile time), yaitu saat kode dikompilasi menjadi program. Contoh berikut menggunakan ketiga bentuk deklarasi sekaligus.
void main() {
final namaFakultas = 'Fakultas Sains';
const nilaiMaksimal = 100;
var nilaiTerpantau = 88;
nilaiTerpantau = 92; // sah, karena nilaiTerpantau masih dapat ditimpa
print('$namaFakultas, nilai maksimal $nilaiMaksimal');
print('Nilai terpantau kini $nilaiTerpantau');
}Fakultas Sains, nilai maksimal 100
Nilai terpantau kini 92Hanya nilaiTerpantau yang berubah dari 88 menjadi 92, karena hanya variabel itu yang dideklarasikan dengan var. Apabila variabel final dicoba ditimpa, analyzer menolaknya dengan pesan yang jelas, sebagaimana ditunjukkan blok berikut.
# buat berkas yang menimpa variabel final, lalu jalankan dart analyze
rm -rf /tmp/uji/variabel-dan-tipe-final && mkdir -p /tmp/uji/variabel-dan-tipe-final
cat > /tmp/uji/variabel-dan-tipe-final/menimpa_final.dart <<'EOF'
void main() {
final nilaiMaksimal = 100;
nilaiMaksimal = 95;
print(nilaiMaksimal);
}
EOF
cd /tmp/uji/variabel-dan-tipe-final && dart analyzeAnalyzing variabel-dan-tipe-final...
error - menimpa_final.dart:3:3 - The final variable 'nilaiMaksimal' can only be set once. Try making 'nilaiMaksimal' non-final. - assignment_to_final_local
1 issue found.Batas antara final dan const tampak pada nilai yang baru diketahui saat program berjalan. Deklarasi final tanggalUjian = DateTime(2026, 11, 10); sah karena nilainya dihitung saat program berjalan. Sebaliknya, deklarasi const saatDiproses = DateTime.now(); ditolak dengan pesan Const variables must be initialized with a constant value. karena hasil pemanggilan DateTime.now() baru diketahui setelah program berjalan.
Memilih deklarasi yang tepat#
Empat bentuk deklarasi dapat dipilih dengan tiga pertanyaan berurutan. Pertama, apakah nilainya sudah tetap sejak kode ditulis, misalnya berupa angka atau teks literal, bila ya, gunakan const. Kedua, apakah nilai diisi satu kali dan tidak berubah selama program berjalan, bila ya, gunakan final. Ketiga, apakah nilai akan ditimpa, bila ya, gunakan var atau anotasi eksplisit sesuai keperluan keterbacaan. Tabel berikut merangkum pilihan tersebut.
| Deklarasi | Nilai dapat ditimpa | Kapan nilai diketahui | Cocok untuk |
|---|---|---|---|
var | Ya | Saat dianalisis, dari nilai awal | variabel yang nilainya berubah |
| anotasi eksplisit | Ya | Ditulis manual pada deklarasi | variabel yang tipenya perlu ditegaskan |
final | Tidak | Saat program berjalan | nilai yang dihitung sekali |
const | Tidak | Sejak waktu kompilasi | literal tetap seperti nilai maksimal |
Program kecil pada contoh akhir menerapkan keempat bentuk deklarasi dalam satu berkas, sehingga setiap barisnya dapat dibandingkan dengan pertanyaan pada tabel di atas.
// Program statistik nilai ujian kecil.
// Menunjukkan empat cara mendeklarasikan variabel di Dart.
void main() {
var jumlahPendaftar = 24; // inferensi: tipe disimpulkan
double rataRataKelas = 87.5; // anotasi eksplisit
final tanggalUjian = DateTime(2026, 11, 10); // diisi satu kali saat program berjalan
const nilaiMaksimal = 100; // tetap sejak waktu kompilasi
print('Mata ujian: Statistika Dasar');
print('Pendaftar: $jumlahPendaftar orang');
print('Rata-rata: $rataRataKelas dari $nilaiMaksimal');
print('Tanggal ujian: ${tanggalUjian.day}-${tanggalUjian.month}-${tanggalUjian.year}');
}Mata ujian: Statistika Dasar
Pendaftar: 24 orang
Rata-rata: 87.5 dari 100
Tanggal ujian: 10-11-2026Variabel tanggalUjian menggunakan final karena nilai DateTime(2026, 11, 10) dihitung saat program berjalan, sedangkan nilaiMaksimal menggunakan const karena 100 adalah literal yang tetap. Kombinasi ini menunjukkan bahwa satu program jarang menggunakan satu bentuk deklarasi saja, dan kompromi antara ketegasan dan fleksibilitas dipilih per variabel.
Kesalahan umum#
Kesalahan pertama adalah mengira var berarti tipe bebas. Variabel var jumlahPendaftar = 24 bertipe int dan menolak nilai String saat kode dianalisis, sebagaimana terlihat pada pesan error di bagian inferensi tipe. Apabila satu variabel memang perlu menampung bilangan bulat dan pecahan, gunakan tipe num yang menampung keduanya. Kebiasaan membaca deklarasi sebagai keputusan tipe, bukan sekadar penulisan nama variabel, mencegah kesalahpahaman tersebut sejak awal.
Kesalahan kedua adalah menggunakan const untuk nilai yang baru diketahui saat program berjalan. Deklarasi const saatDiproses = DateTime.now(); menghasilkan dua pesan error sekaligus, yaitu variabel const wajib diisi nilai konstanta dan konstruktor yang dipanggil bukan konstruktor const. Perbaikannya sederhana, yaitu mengganti deklarasi menjadi final agar nilai dihitung sekali saat program berjalan.
Kesalahan ketiga adalah mendeklarasikan var tanpa nilai awal. Variabel semacam itu bertipe dynamic, sehingga penugasan tipe apa pun tidak ditolak analyzer dan kesalahan tipe baru terdeteksi saat program berjalan. Tulis anotasi tipe eksplisit agar pemeriksaan statis tetap berlaku sejak deklarasi. Prinsip umumnya sederhana, yaitu jangan biarkan tipe variabel ditentukan oleh nilai pertama yang kebetulan ditugaskan.
Ringkasan#
varmenyimpulkan tipe dari nilai awal, dan tipe tersebut tetap diperiksa secara statis seperti anotasi eksplisit.finalmenandai variabel yang hanya diisi satu kali, dengan nilai yang boleh dihitung saat program berjalan.constmenuntut nilai yang sudah diketahui sejak waktu kompilasi dan otomatis bersifat final.- Pemilihan deklarasi mengikuti tiga pertanyaan, yaitu nilai tetap sejak awal menggunakan
const, diisi sekali menggunakanfinal, dan ditimpa menggunakanvaratau anotasi eksplisit.
Referensi#
- Variables — dart.dev
— Dokumentasi resmi deklarasi variabel Dart, termasuk
var,final, danconst. - Built-in types — dart.dev — Daftar tipe bawaan Dart yang menjadi anotasi pada variabel.
- Analyzing Dart code — dart.dev — Cara analyzer memeriksa kode secara statis beserta cara membaca pesan diagnosanya.