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:
| Primitive | Wrapper | Method parse terkait |
|---|---|---|
byte | Byte | Byte.parseByte(String) |
short | Short | Short.parseShort(String) |
int | Integer | Integer.parseInt(String) |
long | Long | Long.parseLong(String) |
float | Float | Float.parseFloat(String) |
double | Double | Double.parseDouble(String) |
char | Character | — (gunakan String.charAt) |
boolean | Boolean | Boolean.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:
stok = 500
kembali = 500
MAX_VALUE = 2147483647
BYTES = 4
SIZE = 32
hasilParse = 2026
beratParse = 62.5
teks = 42, teks2 = 42Mari kita bedah baris-baris kuncinya:
- Baris 4-5 (
Integer.valueOf(500)danstok.intValue()):valueOfmembangkus nilai primitive menjadi objekInteger;intValue()membukanya kembali. Dua method inilah akar dari istilah boxing dan unboxing yang dibahas pada Chapter berikutnya. - Baris 9-11 (
MAX_VALUE,BYTES,SIZE): konstanta class yang menyimpan batas atasint(2.147.483.647), ukuran dalam byte (4), dan ukuran dalam bit (32). Konstanta sejenis tersedia di semua wrapper — ingat programRentangNilaipada Chapter Primitive Data Types yang seluruhnya digerakkan konstanta ini. - Baris 13-14 (
parseIntdanparseDouble): mengubah teks menjadi angka — kebutuhan nomor satu saat membaca masukan pengguna, berkas konfigurasi, atau data API. Hasilnya bertipe primitive murni (int,double), bukan objek. - Baris 16-18 (
String.valueOf(42)danInteger.toString(42)): arah sebaliknya — angka menjadi teks. Keduanya menghasilkan string yang sama;String.valueOfmenerima berbagai tipe, sedangkanInteger.toStringkhususint.
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:
gagal parsing: For input string: "4o2"
program tetap berjalanDua 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 berkasimport 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 berkaspublic 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 berkaspublic 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");
}
}