Class Wrapper
Class Wrapper
Pada bahasa pemrograman Java, terdapat 2 jenis tipe data, yaitu primitif dan referensi
(objek), Tipe Data Primitif adalah tipe data yang tidak memiliki method, hanya memiliki
data saja. Tipe data ini bukanlah sebuah object, sedangkan Tipe Data Referensi adalah
tipe data yang digunakan untuk memegang referensi dari sebuah object ( instance dari
class).
char Character
byte Byte
short Short
int Integer
long Long
boolean Boolean
float Float
double Double
Pada contoh program berikut ini, kita menggunakan Wrapper Class serta mambuat
objek dari class tersebut, dengan tipe data, seperti Character, Integer, Long, Boolean
Float dan Double. Lalu mendefinisikan nilainya pada argumen didalam Constructornya.
package sastra_java;
Output :
Pada tipe data Byte dan Short, harus dimasukan argumen berupa String, selain
menggunakan constructor dengan kata kunci new. Dapat juga membuat objek serta
argumennya seperti berikut ini:
Character objChar = 'W';
Integer objInt = 523;
Boolean objBoolean = true;
Float objFloat = 82.89f;
Double objDouble = 34.67;
Selain menampilkan nilai dari argumen tersebut, dapat pula melihat batasan nilai
maximal dan minimal dari tipe data Byte, Short, Integer, Long, Float, Double. Dengan
menggunakan fungsi MAX_VALUE dan MIN_VALUE, seperti berikut ini:
public static void main(String[] args){
//Melihat Batas Maximal Pada Tipe Data Angka (Bilangan Bulat &
Floating)
System.out.println("Max Value Pada Byte: "+Byte.MAX_VALUE);
System.out.println("Max Value Pada Short: "+Short.MAX_VALUE);
System.out.println("Max Value Pada Integer: "+Integer.MAX_VALUE);
System.out.println("Max Value Pada Long: "+Long.MAX_VALUE);
System.out.println("Max Value Pada Float: "+Float.MAX_VALUE);
System.out.println("Max Value Pada Double: "+Double.MAX_VALUE);
//Melihat Batas Minimal Pada Tipe Data Angka (Bilangan Bulat &
Floating)
System.out.println("Max Value Pada Byte: "+Byte.MIN_VALUE);
System.out.println("Max Value Pada Short: "+Short.MIN_VALUE);
System.out.println("Max Value Pada Integer: "+Integer.MIN_VALUE);
System.out.println("Max Value Pada Long: "+Long.MIN_VALUE);
System.out.println("Max Value Pada Float: "+Float.MIN_VALUE);
System.out.println("Max Value Pada Double: "+Double.MIN_VALUE);
}
output :
Konversi Tipe Data Primitif ke Wrapper Class (Referensi), dan sebaliknya:
Contoh program berikutnya adalah mengubah atau mengkonvert tipe data Primitif ke
Referensi atau sebaliknya, seperti char ke Character, int ke Integer, boolean ke
Boolean, double ke Double dan sebaliknya:
Pada program tersebut, untuk mengubah tipe data Primitif ke Wrapper Class, dapat
digunakan fungsi valueOf(). Untuk sebaliknya dapat menggunakan fungsi charValue,
intValue, booleanValue, dsb.
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.
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.
Sebelum JDK 1.5 jika kita ingin menggunakan tipe primitif dalam Collection
misalnya array list, maka kita 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 import java.util.ArrayList;
2
3 public class TestBoxing {
4 //Contoh kode program dalam jdk 1.4
5 public static void main(String[] args) {
6 ArrayList listAngka = new ArrayList();
7 listAngka.add(5);//compilation error
8 listAngka.add(new Integer(5));//Bekerja ketika "Boxed"
9 //unboxed menggunakan "intValue()" untuk mendapatkan nilai "int"
10 int elementPertama = ((Integer)listAngka.get(0)).intValue();
11 }
12 }
Perbedaan Setelah fitur autoboxing diperkenalkan :
1 Import java.util.ArrayList;
2
3 public class TestBoxing {
4 //Contoh kode program dalam jdk 1.5
5 public static void main(String[] args) {
6 ArrayList listAngka = new ArrayList();
7 listAngka.add(5); //boxed otomatis
8 int elemenPertama = (Integer) listAngka.get(0); //Otomatis unboxed; tanpa method "intValue()".
9 }
10 }
Untuk menghindari konversi tipe (mis. (Integer) listAngka.get (0) – dalam contoh
diatas); Maka bisa digunakan generics. Sehingga kodenya akan terlihat lebih
mudah dibaca, seperti contoh di bawah ini:
1 import java.util.ArrayList;
2
3 public class TestBoxing {
4 public static void main(String[] args) {
5 ArrayList<Integer> listAngka = new ArrayList<Integer>();
6 listAngka.add(5);
7 int elementPertama = listAngka.get(0);
8 }
9}
Jika situasi di atas terjadi sebaliknya, maka Unboxing dilakukan oleh kompiler
java.
Dan jika operasi unary atau kondisional dilakukan pada objek class wrapper
maka unboxing dilakukan oleh kompiler. Berikut ini adalah contoh kode
programnya.
1 Integer i = new Integer(10);
2 i++; //Unboxing
3 int sum = 0;
4
5 if (i % 2 == 0) {//Unboxing
6 sum += i;//Unboxing
7}
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.
Output:
1 Int
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 public class TestBoxing {
2
3 public static void display(Integer i) {
4 System.out.print("Integer");
5 }
6
7 public static void display(Integer... i) {
8 System.out.print("Integer...");
9 }
10
11 public static void main(String[] args) {
12 int x = 10;
13 display(x);
14 }
15 }
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.