Memahami Wrapper Class, Autoboxing dan Inboxing Pada Java

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.

wrapper_class_autoboxing_inboxing

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 :

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:

Setelah fitur autoboxing diperkenalkan:

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:

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:

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.

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.

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.

Output:

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.

Output:

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.

Be the first to comment

Leave a Reply

Your email address will not be published.


*