Apa itu wrapper class?
Wrapper class pada Java ini menyediakan mekanisme untuk mengkonversi tipe data primitif menjadi objek dan objek menjadi tipe primitif.
Seperti kita ketahui sebelumnya, nilai primitif bukanlah objek, namun nilai ini bisa dibungkus (wrap) dengan menggunakan class-class wrapper di Java API (Application Programming Interface).
Java memiliki dukungan API yang kaya, sehingga menjadi salah satu alasan mengapa Java menjadi bahasa pemrograman yang harus dipelajari.

Karena Java adalah pemrograman yang berorientasi objek, maka kinerjanya akan terpengaruh bila nilai dari tipe data primitif ini diperlakukan sebagai objek.
Namun, terlepas dari itu semua, banyak method pada Java yang memerlukan penggunaan objek-objek sebagai argumen (pass by value).
Autoboxing dan Inboxing
Sebelum JDK 1.5, tidak mudah untuk melakukan konversi dari tipe primitif seperti int, char, float, double, byte, long, short, atau boolean menjadi equivalen dengan objeknya dari class Integer, Character, Float, Double, Byte, Long, Short atau Boolean.
Dalam Java, proses konversi dari tipe primitif menjadi objek dikenal dengan autoboxing, dan sebaliknya konversi dari objek ke tipe primitif disebut dengan inboxing.
Fitur ini mulai berjalan secara otomatis sejak J2SE 5.0.
Class-class wrapper ini berada dalam java.lang package yang berjumlah 8 class, yaitu :
1 2 3 4 5 6 7 8 9 |
TIPE PRIMITIF CLASS WRAPPER boolean Boolean byte Byte char Character float Float int Integer long Long short Short double Double |
Beberapa method dari class-class tersebut yang digunakan untuk proses autoboxing dan inboxing adalah
- doubleValue()
- floatValue()
- intValue()
- longValue()
- shortValue()
- byteValue()
Namun autoboxing dan inboxing ini hadir dengan peringatan tertentu yang perlu dipahami sebelum menggunakannya pada saat melakukan coding, yang menjadi lebih penting lagi. Karena ini terjadi secara otomatis sehingga berpeluang membuat bug halus jika anda tidak dapat mengetahui kapan autoboxing atau inboxing terjadi.
Sebelum Java 1.5, sering terdapat topik penting mengenai jika anda menggunakan Collections seperti Hashmap ataupun ArrayList, maka anda tidak bisa menyimpan secara langsung tipe data primitif ke dalam Collections tersebut, melainkan anda harus mengonversi tipe data primitif tersebut menjadi Objek baru kemudian anda bisa menyimpannya kedalam Collections.
Dengan diperkenalkannya autoboxing dan inboxing ini, maka compiler Java secara otomatis melakukan konversi tipe primitif menjadi objek sehingga lebih memudahkan dalam pembacaan kode.
Kapan Autoboxing dan Inboxing Digunakan?
Autoboxing diaplikasikan oleh compiler pada kondisi berikut:
- Ketika melakukan pemanggilan method dimana objek sebagai argumen diharapkan, jika nilai primitif di-pass-kan maka Java secara otomatis akan mengkonversi nilai primitif tersebut menjadi nilai Objek yang sama.
- Ketika nilai primitif ditetapkan pada variabel dari wrapper class terkait.
Contoh autoboxing saat nilai primitif ditetapkan pada variabel dari wrapper class
Sebelum JDK 1.5 jika kita ingin menggunakan tipe primitif dalam Collection misalnya array list, maka Anda perlu mem-“box” nya. Karena tidak ada auto boxing atau unboxing sebelum JDK 1.5. Berikut ini adalah kode yang ditulis dalam versi JDK 1.4:
1 2 3 4 5 6 7 8 9 10 11 12 |
import java.util.ArrayList; public class TestBoxing { //Contoh kode program dalam jdk 1.4 public static void main(String[] args) { ArrayList listAngka = new ArrayList(); listAngka.add(5);//compilation error listAngka.add(new Integer(5));//Bekerja ketika "Boxed" //unboxed menggunakan "intValue()" untuk mendapatkan nilai "int" int elementPertama = ((Integer)listAngka.get(0)).intValue(); } } |
Setelah fitur autoboxing diperkenalkan:
1 2 3 4 5 6 7 8 9 10 |
import java.util.ArrayList; public class TestBoxing { //Contoh kode program dalam jdk 1.5 public static void main(String[] args) { ArrayList listAngka = new ArrayList(); listAngka.add(5); //boxed otomatis int elemenPertama = (Integer) listAngka.get(0); //Otomatis unboxed; tanpa method "intValue()". } } |
Catatan:
Jika Anda mau menghindari konversi tipe (mis. (Integer) listAngka.get (0) – dalam contoh diatas); Maka Anda bisa menggunakan generics. Jadi kodenya akan terlihat lebih mudah dibaca, seperti contoh di bawah ini:
1 2 3 4 5 6 7 8 9 |
import java.util.ArrayList; public class TestBoxing { public static void main(String[] args) { ArrayList<Integer> listAngka = new ArrayList<Integer>(); listAngka.add(5); int elementPertama = listAngka.get(0); } } |
Kapan Unboxing Terjadi Dalam Java
Sesuai dokumentasi java ada dua situasi dimana bisa terjadi Autoboxing atau Unboxing.
Pertama, bila method mengharapkan class wrapper dan pemanggil / caller melewati tipe primitif yang sesuai, maka tipe primitif akan diautobox. Seperti contoh berikut ini:
1 2 3 4 5 |
public void tampilkan(Integer i){ System.out.print(i); } int x = 10; display(x); |
Kedua, bila tipe primitif ditetapkan ke variabel class wrapper yang sesuai maka nilai primitif akan diautobox. Contoh kode di bawah ini menggambarkan hal yang sama.
1 2 |
int x = 10; Integer y = x; |
Bila situasi di atas terjadi sebaliknya, maka Unboxing dilakukan oleh kompiler java.
Bila operasi unary atau kondisional dilakukan pada objek class wrapper maka unboxing dilakukan oleh kompiler. Berikut ini adalah contoh kode programnya.
1 2 3 4 5 6 7 |
Integer i = new Integer(10); i++; //Unboxing int sum = 0; if (i % 2 == 0) {//Unboxing sum += i;//Unboxing } |
Autoboxing dan Unboxing dengan method overloading
Nilai data primitif dapat diautobox ke wrapper class jika paramter pada method mengharapkan objek wrapper. Tetapi bagaimana jika metode itu overload dengan method lain yang memiliki tipe parameter lain?
Berikut adalah berbagai kemungkinannya.
Widening VS Boxing
Widening akan mengubah suatu variabel ke variabel lain dengan tipe yang lebih luas. Misalnya String -> Object, byte -> int, int -> long, dll. Jika overloading terdapat dalam kasus di mana satu metode memiliki parameter “widening” dan metode lainnya memiliki parameter “box” maka widening akan mengambil prioritas daripada boxing. Dengan kata lain widening akan mengalahkan boxing.
Contoh program diberikan di bawah ini.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class TestBoxing { public static void tampilkan(Integer i) { System.out.print("Integer"); } public static void tampilkan(int i) { System.out.print("int"); } public static void main(String[] args) { short x = 5; tampilkan(x); } } |
Output:
1 |
int |
Varargs VS Boxing
Varargs adalah fitur lain yang diperkenalkan di jdk 1.5. Jika Varargs digunakan sebagai parameter dalam suatu metode dan metode itu overload, maka Boxing lebih diprioritaskan daripada Varargs, dengan kata lain Boxing mengalahkan Varargs.
Contoh program diberikan di bawah ini.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class TestBoxing { public static void display(Integer i) { System.out.print("Integer"); } public static void display(Integer... i) { System.out.print("Integer..."); } public static void main(String[] args) { int x = 10; display(x); } } |
Output:
1 |
Integer |
Akhirnya satu hal yang perlu diingat, operasi otomatis seperti “widening lalu boxing” tidak bisa dilakukan. Jadi satu variabel hanya dapat “diperlebar” atau “di-autoboxed” pada satu waktu. Proses keduanya secara bersamaan tidak memungkinkan.
Jadi, kode berikut tidak akan dikompilasi.
1 2 3 4 5 6 7 8 9 10 11 |
public class TestBoxing { public static void display(Long i) { System.out.print("long"); } public static void main(String[] args) { int x = 10; display(x); } } |
Leave a Reply