Tipe primitive efisien, tetapi miskin: int tidak punya method, tidak bisa bernilai null, dan tidak diterima sebagai tipe argumen generics seperti List<int>. Dunia berorientasi objek Java menuntut warga bertipe reference. Untuk menjembatani keduanya, pustaka standar menyediakan wrapper class untuk setiap primitive: Integer membungkus int, Double membungkus double, dan seterusnya. Pada Chapter ini kita pelajari fungsi-fungsi utama wrapper — konstanta, konversi string, dan pintu masuk dunia objek — sebelum Chapter berikutnya memperlihatkan proses pembungkusan yang berlangsung otomatis.

Delapan Class Pembungkus #

Pemetaannya berpasangan satu-satu dengan tipe primitive:

PrimitiveWrapperMethod parse terkait
byteByteByte.parseByte(String)
shortShortShort.parseShort(String)
intIntegerInteger.parseInt(String)
longLongLong.parseLong(String)
floatFloatFloat.parseFloat(String)
doubleDoubleDouble.parseDouble(String)
charCharacter— (gunakan String.charAt)
booleanBooleanBoolean.parseBoolean(String)

Tiga peran utama menjelaskan mengapa wrapper wajib dikuasai. Pertama, generics dan collections hanya menerima reference — List<Integer> sah, List<int> ditolak compiler. Kedua, field objek yang boleh kosong — database sering mengirim “tidak ada nilai” (NULL) yang tidak punya padanan primitive, sedangkan Integer dapat bernilai null. Ketiga, gudang utilitas dan konstanta — Integer.MAX_VALUE hingga Integer.parseInt semuanya menempel pada class pembungkus.

Konstanta dan Method Utilitas #

Program berikut membedah isi kelas Integer dan Double yang paling sering dipakai:

public class KelasPembungkus {
    public static void main(String[] args) {
        Integer stok = Integer.valueOf(500);       // int -> Integer
        int kembali = stok.intValue();             // buka bungkus secara eksplisit
        System.out.println("stok     = " + stok);
        System.out.println("kembali  = " + kembali);

        System.out.println("MAX_VALUE = " + Integer.MAX_VALUE);
        System.out.println("BYTES     = " + Integer.BYTES);
        System.out.println("SIZE      = " + Integer.SIZE);

        int hasilParse = Integer.parseInt("2026");
        double beratParse = Double.parseDouble("62.5");
        System.out.println("hasilParse  = " + hasilParse);
        System.out.println("beratParse  = " + beratParse);

        String teks = String.valueOf(42);
        String teks2 = Integer.toString(42);
        System.out.println("teks = " + teks + ", teks2 = " + teks2);
    }
}

Output yang Dihasilkan:

text
stok     = 500
kembali  = 500
MAX_VALUE = 2147483647
BYTES     = 4
SIZE      = 32
hasilParse  = 2026
beratParse  = 62.5
teks = 42, teks2 = 42

Mari kita bedah baris-baris kuncinya:

  1. Baris 4-5 (Integer.valueOf(500) dan stok.intValue()): valueOf membangkus nilai primitive menjadi objek Integer; intValue() membukanya kembali. Dua method inilah akar dari istilah boxing dan unboxing yang dibahas pada Chapter berikutnya.
  2. Baris 9-11 (MAX_VALUE, BYTES, SIZE): konstanta class yang menyimpan batas atas int (2.147.483.647), ukuran dalam byte (4), dan ukuran dalam bit (32). Konstanta sejenis tersedia di semua wrapper — ingat program RentangNilai pada Chapter Primitive Data Types yang seluruhnya digerakkan konstanta ini.
  3. Baris 13-14 (parseInt dan parseDouble): mengubah teks menjadi angka — kebutuhan nomor satu saat membaca masukan pengguna, berkas konfigurasi, atau data API. Hasilnya bertipe primitive murni (int, double), bukan objek.
  4. Baris 16-18 (String.valueOf(42) dan Integer.toString(42)): arah sebaliknya — angka menjadi teks. Keduanya menghasilkan string yang sama; String.valueOf menerima berbagai tipe, sedangkan Integer.toString khusus int.

Konversi String yang Bisa Gagal #

Method parseXxx mengasumsikan teks masukan memang angka yang sah. Satu karakter asing — dan NumberFormatException terlempar. Program nyata yang membaca masukan pengguna karenanya wajib membungkus parsing dalam try-catch:

public class KonversiAman {
    public static void main(String[] args) {
        String masukan = "4o2";   // salah ketik: huruf o
        try {
            int nilai = Integer.parseInt(masukan);
            System.out.println("nilai = " + nilai);
        } catch (NumberFormatException e) {
            System.out.println("gagal parsing: " + e.getMessage());
        }
        System.out.println("program tetap berjalan");
    }
}

Output yang Dihasilkan:

text
gagal parsing: For input string: "4o2"
program tetap berjalan

Dua hal menonjol pada keluaran program di atas. Pertama, exception tertangkap dan e.getMessage() memuat teks For input string: "4o2" — teks bermasalah dilaporkan apa adanya sehingga log aplikasi langsung menunjukkan sumber kesalahan. Kedua, baris setelah blok try-catch tetap tereksekusi; tanpa penangkapan, JVM akan menghentikan method saat itu juga dan stack trace tercetak ke layar pengguna.

Generics Menuntut Reference #

Peran wrapper yang paling terasa sehari-hari adalah membuka pintu generics. Compiler menolak tipe primitive di posisi argumen generics:

import java.util.List;

public class DaftarPrimitive {
    public static void main(String[] args) {
        List<int> angka = List.of(1, 2, 3);
        System.out.println(angka);
    }
}

Pesan compiler-nya: error: unexpected type dengan rincian required: reference, found: int. Generics bekerja lewat type erasure pada objek, dan primitive tidak hidup di dunia objek — sehingga List<Integer> menjadi satu-satunya jalan. Perbaikan baris tersebut cukup mengganti int menjadi Integer, dan nilai 1, 2, 3 akan dibungkus otomatis — topik tepat untuk Chapter berikutnya.

Class pembungkus menuntaskan puzzle terakhir: objek Integer dan nilai int kini sama-sama tersedia. Pertanyaan berikutnya — apakah kita harus menulis Integer.valueOf(...) dan .intValue() setiap saat? Ternyata tidak: sejak Java 5, compiler melakukannya untuk kita lewat autoboxing dan unboxing, lengkap dengan satu jebakan perbandingan == yang sudah menunggu di Chapter berikutnya.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

DaftarPrimitive.java

Unduh berkas
java
import java.util.List;

public class DaftarPrimitive {
    public static void main(String[] args) {
        List<int> angka = List.of(1, 2, 3);
        System.out.println(angka);
    }
}

KelasPembungkus.java

Unduh berkas
java
public class KelasPembungkus {
    public static void main(String[] args) {
        Integer stok = Integer.valueOf(500);       // int -> Integer
        int kembali = stok.intValue();             // buka bungkus secara eksplisit
        System.out.println("stok     = " + stok);
        System.out.println("kembali  = " + kembali);

        System.out.println("MAX_VALUE = " + Integer.MAX_VALUE);
        System.out.println("BYTES     = " + Integer.BYTES);
        System.out.println("SIZE      = " + Integer.SIZE);

        int hasilParse = Integer.parseInt("2026");
        double beratParse = Double.parseDouble("62.5");
        System.out.println("hasilParse  = " + hasilParse);
        System.out.println("beratParse  = " + beratParse);

        String teks = String.valueOf(42);
        String teks2 = Integer.toString(42);
        System.out.println("teks = " + teks + ", teks2 = " + teks2);
    }
}

KonversiAman.java

Unduh berkas
java
public class KonversiAman {
    public static void main(String[] args) {
        String masukan = "4o2";   // salah ketik: huruf o
        try {
            int nilai = Integer.parseInt(masukan);
            System.out.println("nilai = " + nilai);
        } catch (NumberFormatException e) {
            System.out.println("gagal parsing: " + e.getMessage());
        }
        System.out.println("program tetap berjalan");
    }
}