Konstanta, var, dan Literal

Membekukan nilai dengan final, menyingkat tipe lokal dengan var, serta menulis literal numerik dengan garis bawah.

Daftar isi

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.

java Contoh: mengisi ulang konstanta ditolak kompiler
// tidak-dijalankan
final int BATAS_SKS = 24;
BATAS_SKS = 30; // error: cannot assign a value to final variable BATAS_SKS

Angka 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.

java KonstantaVar.java
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));
    }
}
text Keluaran
Total      : 45000.0
Potongan   : 11250.0
Total bayar: 33750.0
Sisa kuota : 6

Perhatikan 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.

java LiteralAngka.java
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);
    }
}
text Keluaran
Desimal dengan garis bawah: 275000000
Heksadesimal 0x1F         : 31
Biner 0b1010              : 10
Long berakhiran L         : 384400000
Double                    : 68.5
Float berakhiran f        : 36.8

Garis 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#

  • var tanpa pengisian awal, seperti var total;, memicu pesan cannot use 'var' on a variable without initializer. Perbaikannya mengisi nilai pada deklarasinya atau menulis tipe eksplisit.
  • var yang diisi null, seperti var nama = null;, juga ditolak karena tipe tidak dapat disimpulkan dari null. 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 _15000 atau 15000_, memicu error kompilasi. Tempatkan garis bawah hanya di antara dua digit.
  • Mengira final membekukan isi objek. Deklarasi final String teks = "A"; mencegah teks diisi ulang, tetapi pembahasan objek yang isinya berubah menyusul bersama kelas dan objek.

Ringkasan#

  • Kata kunci final menjadikan variabel konstanta, yaitu sekali diisi dan tidak boleh diisi ulang, dengan konvensi penamaan huruf besar dan garis bawah.
  • Kata kunci var menyimpulkan tipe variabel lokal dari nilai awalnya, hanya berlaku untuk variabel lokal, dan tetap menghasilkan tipe yang pasti.
  • Literal numerik mendukung heksadesimal 0x, biner 0b, oktal dengan awalan nol, garis bawah pemisah digit, dan akhiran L, f, serta d.
  • Garis bawah pada literal hanya sah di antara dua digit, dan awalan nol pada desimal adalah jebakan oktal yang tidak memicu error.

Referensi#