Topik ini melengkapi pernyataan deklarasi dengan tiga fasilitas yang muncul di hampir setiap berkas Java. Konstanta final membekukan nilai agar tidak berubah, kata kunci var menyingkat penulisan tipe pada variabel lokal, dan literal menunjukkan cara berbagai bentuk angka ditulis langsung di dalam kode. Setelah selesai membaca, angka seperti 0x1F, 0b1010, dan 275_000_000 dapat dibaca tanpa ragu.
Membekukan nilai dengan final#
Konstanta adalah variabel yang nilainya tidak boleh berubah setelah diisi, ditulis dengan kata kunci final di depan tipenya. Baris final int BATAS_SKS = 24; mengunci nilai 24 pada BATAS_SKS sampai program berakhir, dan setiap pernyataan yang mencoba mengisinya ulang ditolak kompiler dengan pesan cannot assign a value to final variable.
Konvensi penamaannya juga khas, yaitu huruf besar semua dengan garis bawah sebagai pemisah kata, seperti SUKU_DISKON atau BATAS_SKS. Bentuk ini membuat konstanta segera terbedakan dari variabel biasa saat kode dibaca. Manfaat utamanya bukan sekadar rapi, melainkan satu titik perubahan untuk satu nilai yang dipakai di banyak tempat, sehingga tarif atau batas yang berganti cukup diperbaiki di satu baris.
// tidak-dijalankan
final int BATAS_SKS = 24;
BATAS_SKS = 30; // error: cannot assign a value to final variable BATAS_SKSAngka yang berdiri sendiri tanpa penjelasan di dalam kode, seperti 0.25 yang muncul tiba-tiba, sering disebut magic number. Memberinya nama melalui final memindahkan maknanya ke dalam kode, sehingga total * DISKON langsung terbaca bermakna tanpa perlu membaca komentar.
Menyingkat tipe lokal dengan var#
Sejak Java 10, variabel lokal dapat dideklarasikan dengan kata kunci var, dan tipe penampungnya disimpulkan otomatis dari nilai di sebelah kanan tanda sama dengan. Baris var jumlahBarang = 3; menghasilkan variabel int, sedangkan var hargaSatuan = 15000.0; menghasilkan variabel double. Pengetikan tidak menjadi longgar, karena var hanyalah singkatan penulisan, dan variabelnya tetap bertipe pasti sampai akhir umurnya.
Batas pemakaiannya tegas, yaitu var hanya sah untuk variabel lokal di dalam metode. Parameter metode, field kelas, dan tipe kembalian tetap wajib ditulis eksplisit. Selain itu, var wajib disertai pengisian nilai pada deklarasinya, karena tanpa nilai di sebelah kanan, kompiler tidak punya dasar untuk menyimpulkan tipenya.
Program berikut memakai final dan var sekaligus pada perhitungan diskon kecil.
public class KonstantaVar {
public static void main(String[] args) {
// konstanta, nilainya tidak boleh berubah setelah diisi
final double DISKON = 0.25;
final int BATAS_SKS = 24;
// var, tipe ditentukan otomatis dari nilai di sebelah kanan
var jumlahBarang = 3; // dianggap int
var hargaSatuan = 15000.0; // dianggap double
var total = jumlahBarang * hargaSatuan;
var potongan = total * DISKON;
var totalBayar = total - potongan;
System.out.println("Total : " + total);
System.out.println("Potongan : " + potongan);
System.out.println("Total bayar: " + totalBayar);
System.out.println("Sisa kuota : " + (BATAS_SKS - 18));
}
}Total : 45000.0
Potongan : 11250.0
Total bayar: 33750.0
Sisa kuota : 6Perhatikan bahwa var paling bermanfaat ketika tipe di sebelah kanan sudah jelas terbaca, misalnya hasil pemanggilan metode atau perhitungan. Untuk kasus sederhana seperti var x = 3, menulis int x = 3 sama mudahnya, dan sebagian tim tetap memilih bentuk eksplisit demi konsistensi. Keduanya sah, asalkan pilihannya konsisten di satu proyek.
Bentuk literal numerik#
Literal adalah nilai yang ditulis langsung di dalam kode, seperti 17, 15000.0, atau "Halo". Bilangan bulat boleh ditulis dalam empat sistem bilangan, yaitu desimal biasa, heksadesimal dengan awalan 0x, biner dengan awalan 0b, dan oktal dengan awalan angka nol. Selain itu, literal besar boleh disisipi garis bawah sebagai pemisah kelompok digit, dan akhiran huruf menentukan tipenya, yakni L untuk long, f untuk float, dan d untuk double.
public class LiteralAngka {
public static void main(String[] args) {
int jumlahPenduduk = 275_000_000;
int kodeWarna = 0x1F; // heksadesimal, sama dengan 31
int modeSensor = 0b1010; // biner, sama dengan 10
long jarakKilometer = 384_400_000L;
double berat = 68.5;
float suhuTubuh = 36.8f;
System.out.println("Desimal dengan garis bawah: " + jumlahPenduduk);
System.out.println("Heksadesimal 0x1F : " + kodeWarna);
System.out.println("Biner 0b1010 : " + modeSensor);
System.out.println("Long berakhiran L : " + jarakKilometer);
System.out.println("Double : " + berat);
System.out.println("Float berakhiran f : " + suhuTubuh);
}
}Desimal dengan garis bawah: 275000000
Heksadesimal 0x1F : 31
Biner 0b1010 : 10
Long berakhiran L : 384400000
Double : 68.5
Float berakhiran f : 36.8Garis bawah hanya diperbolehkan di antara dua digit. Bentuk seperti 275__000 yang menyambung dua garis bawah, _275 yang mengawali, atau 275_ yang mengakhiri semuanya ditolak kompiler. Aturan yang sama berlaku di sekitar titik desimal, sehingga 68._5 tidak sah, sedangkan 38_4400 sah meskipun kelompoknya tidak lazim. Nilai cetak tidak menyimpan garis bawah sama sekali, karena garis itu hanya dekorasi penulisan.
Kapan final dan var dipakai#
final dipakai untuk setiap nilai yang memang tidak boleh berubah selama program berjalan, seperti tarif, batas kuota, atau konstanta fisika. Membekukan nilai sejak awal memberi dua jaminan, yaitu kompiler mencegah perubahan yang tak disengaja, dan pembaca kode tahu bahwa nilai itu stabil. Pada kelas yang akan datang, final memperluas perannya ke parameter dan referensi objek, tetapi makna dasarnya tetap sama, yaitu tidak boleh diisi ulang.
var dipakai bila penulisan tipe eksplisit terasa berulang atau menghalangi pembacaan, misalnya pada tipe yang panjang. Ujian sederhananya, baca kode dari kanan, dan bila tipenya langsung terlihat, var aman dipakai. Bila tipe di sebelah kanan samar, misalnya hasil ekspresi yang panjang, menulis tipe eksplisit lebih membantu pembaca daripada menyelamatkan penulis.
Kesalahan umum#
vartanpa pengisian awal, sepertivar total;, memicu pesancannot use 'var' on a variable without initializer. Perbaikannya mengisi nilai pada deklarasinya atau menulis tipe eksplisit.varyang diisinull, sepertivar nama = null;, juga ditolak karena tipe tidak dapat disimpulkan darinull. Deklarasikan tipenya secara eksplisit untuk kasus ini.- Awalan nol pada desimal, misalnya
075, terbaca sebagai oktal dan nilainya berbeda dari dugaan. Hapus awalan nol atau tulis bentuk lain yang disengaja, seperti biner atau heksadesimal. - Garis bawah di posisi terlarang, misalnya
_15000atau15000_, memicu error kompilasi. Tempatkan garis bawah hanya di antara dua digit. - Mengira
finalmembekukan isi objek. Deklarasifinal String teks = "A";mencegahteksdiisi ulang, tetapi pembahasan objek yang isinya berubah menyusul bersama kelas dan objek.
Ringkasan#
- Kata kunci
finalmenjadikan variabel konstanta, yaitu sekali diisi dan tidak boleh diisi ulang, dengan konvensi penamaan huruf besar dan garis bawah. - Kata kunci
varmenyimpulkan tipe variabel lokal dari nilai awalnya, hanya berlaku untuk variabel lokal, dan tetap menghasilkan tipe yang pasti. - Literal numerik mendukung heksadesimal
0x, biner0b, oktal dengan awalan nol, garis bawah pemisah digit, dan akhiranL,f, sertad. - Garis bawah pada literal hanya sah di antara dua digit, dan awalan nol pada desimal adalah jebakan oktal yang tidak memicu error.
Referensi#
- JEP 286: Local-Variable Type Inference — OpenJDK
— Proposal resmi kata kunci
var, termasuk batas pemakaiannya. - Primitive Data Types — Oracle — Bagian resmi tentang literal numerik dan aturan garis bawahnya.
- Integer Literals, JLS SE 21 §3.10.1 — Oracle — Spesifikasi bentuk literal bilangan bulat, termasuk oktal dan heksadesimal.