Ing artikel iki kita bakal ndeleng fitur ing Jawa sing diarani
autoboxing/unboxing . Autoboxing lan unboxing minangka fungsi kanggo ngowahi jinis primitif dadi jinis obyek lan kosok balene.
Kabeh proses ditindakake kanthi otomatis dening Java Runtime Environment (JRE). Nanging sampeyan kudu ati-ati nalika ngetrapake fungsi iki, amarga ... Bisa mengaruhi kinerja program sampeyan.
Pambuka
Ing versi ing ngisor JDK 1.5, ora gampang ngowahi jinis data primitif kayata
int
,
char
,
float
,
double
menyang kelas bungkus Integer, Character, Float, Double. Miwiti karo JDK 5, fungsi iki, ngowahi jinis primitif dadi obyek sing padha, dileksanakake kanthi otomatis. Properti iki dikenal minangka
Autoboxing . Proses mbalikke, mungguh,
Unboxing , i.e. proses ngowahi obyek menyang jinis primitif sing cocog. Kode conto kanggo autoboxing lan unboxing diwenehi ing ngisor iki:
Autoboxing
Integer integer = 9;
Unboxing
int in = 0;
in = new Integer(9);
Nalika packing otomatis lan unpacking digunakake? Autoboxing digunakake dening compiler Java ing kahanan ing ngisor iki:
- Nalika Nilai saka jinis primitif liwati menyang cara minangka parameter cara, kang ngarepake obyek saka kelas pambungkus cocog.
- Nalika Nilai saka jinis primitif diutus kanggo variabel saka kelas pambungkus cocog.
Coba conto ing ngisor iki:
Listing 1: Kode prasaja sing nuduhake autoboxing
public int sumEvenNumbers(List<Integer> intList ) {
int sum = 0;
for (Integer i: intList )
if ( i % 2 == 0 )
sum += i;
return sum;
}
Sadurunge jdk 1.5, kode ing ndhuwur bakal nyebabake kesalahan kompilasi amarga sisa operator% lan unary plus += ora bisa ditrapake ing kelas pambungkus. Nanging ing jdk 1.5 lan ndhuwur kode iki kompilasi tanpa kasalahan, Ngonversi Integer kanggo
int
. Unboxing digunakake dening compiler Java ing kahanan ing ngisor iki:
- Nalika obyek liwati minangka parameter kanggo cara sing ngarepake jinis primitif cocog.
- Nalika obyek diutus kanggo variabel saka jinis primitif cocog.
Coba conto ing ngisor iki:
Listing 2: Kode prasaja nuduhake unboxing
import java.util.ArrayList;
import java.util.List;
public class UnboxingCheck {
public static void main(String[] args) {
Integer in = new Integer(-8);
int absVal = absoluteValue(in);
System.out.println("absolute value of " + in + " = " + absVal);
List<Double> doubleList = new ArrayList<Double>();
doubleList.add(3.1416);
double phi = doubleList.get(0);
System.out.println("phi = " + phi);
}
public static int absoluteValue(int i) {
return (i < 0) ? -i : i;
}
}
Autoboxing lan unboxing ngidini pangembang nulis kode sing gampang diwaca lan dingerteni. Tabel ing ngisor iki nuduhake jinis data primitif lan obyek pambungkus sing cocog.
Jinis primitif |
Kelas Shell |
boolean |
Boolean |
bait |
Byte |
char |
Watak |
ngambang |
ngambang |
int |
Ongko |
dawa |
dawa |
cendhak |
Singkat |
Tabel 1: Jinis primitif lan kelas bungkus sing padha karo operator perbandingan Autoboxing lan unboxing bisa digunakake karo operator perbandingan. Cuplikan kode ing ngisor iki nggambarake kepiye kedadeyan kasebut:
Listing 3: Kode conto sing nuduhake autoboxing lan unboxing karo operator pembanding
public class BoxedComparator {
public static void main(String[] args) {
Integer in = new Integer(25);
if (in < 35)
System.out.println("Value of int = " + in);
}
}
Autopacking lan unpacking nalika overloading cara Autopacking lan unpacking ditindakake nalika overloading cara adhedhasar aturan ing ngisor iki:
- Ekspansi "kalah" kemasan ing kahanan sing ana pilihan antarane ekspansi lan kemasan; ekspansi luwih disenengi.
Listing 4: Kode conto sing nuduhake keuntungan saka overloading
public class WideBoxed {
public class WideBoxed {
static void methodWide(int i) {
System.out.println("int");
}
static void methodWide( Integer i ) {
System.out.println("Integer");
}
public static void main(String[] args) {
short shVal = 25;
methodWide(shVal);
}
}
}
Output program - jinis
int
- Ekspansi ngalahake nomer variabel argumen Ing kahanan sing dadi pilihan antarane ekspansi lan nomer variabel argumen, ekspansi luwih disenengi.
Listing 5: Kode conto sing nuduhake keuntungan saka overloading
public class WideVarArgs {
static void methodWideVar(int i1, int i2) {
System.out.println("int int");
}
static void methodWideVar(Integer... i) {
System.out.println("Integers");
}
public static void main( String[] args) {
short shVal1 = 25;
short shVal2 = 35;
methodWideVar( shVal1, shVal2);
}
}
- Packing ngalahaken nomer variabel argumen Ing kahanan sing dadi pilihan antarane packing lan nomer variabel argumen, packing luwih disenengi.
Listing 6: Kode conto sing nuduhake keuntungan saka overloading
public class BoxVarargs {
static void methodBoxVar(Integer in) {
System.out.println("Integer");
}
static void methodBoxVar(Integer... i) {
System.out.println("Integers");
}
public static void main(String[] args) {
int intVal1 = 25;
methodBoxVar(intVal1);
}
}
Sampeyan kudu mbudidaya bab ing ngisor iki nalika nggunakake Auto Packing: Kita ngerti, saben fitur apik duwe drawback. Packaging otomatis ora pangecualian ing babagan iki. Sawetara cathetan penting sing kudu dielingi pangembang nalika nggunakake fitur iki:
- Mbandhingake obyek karo
==
operator '' bisa mbingungake, amarga bisa ditrapake kanggo jinis lan obyek primitif. Nalika operator iki Applied kanggo obyek, iku bener mbandhingaké referensi kanggo obyek, ora obyek piyambak.
Listing 7: Kode conto sing nuduhake perbandingan.
public class Comparator {
public static void main(String[] args) {
Integer istInt = new Integer(1);
Integer secondInt = new Integer(1);
if (istInt == secondInt) {
System.out.println("both one are equal");
} else {
System.out.println("Both one are not equal");
}
}
}
- Nyampur obyek lan jinis primitif kanthi operator kesetaraan lan relasional. Yen kita mbandhingake jinis primitif karo obyek, banjur obyek wis unboxed, kang bisa uncalan
NullPointerException
yen obyek null
.
- Caching obyek. Cara kasebut
valueOf()
nggawe wadhah obyek primitif sing disimpen. Amarga nilai-nilai sing di-cache ing kisaran -128 nganti 127, kalebu, obyek sing di-cache iki bisa tumindak kanthi beda.
- Degradasi kinerja. Autoboxing utawa unboxing ngrusak kinerja aplikasi amarga nggawe obyek sing ora dikarepake sing meksa pengepul sampah luwih kerep mlaku.
Cacat AutoBoxing Senajan AutoBoxing wis sawetara kaluwihan, iku wis cacat ing ngisor iki:
Listing 8: Kode sampel nuduhake masalah kinerja.
public int sumEvenNumbers(List intList) {
int sum = 0;
for (Integer i : intList) {
if (i % 2 == 0) {
sum += i;
}
}
return sum;
}
Ing bagean kode iki,
sum +=i
bakal ditambahi dadi
sum = sum + i
. Miwiti karo
+
operator ' ', JVM wiwit mbukak kothak amarga
+
operator ' ' ora bisa ditrapake kanggo obyek Integer. Lan banjur asil autopacked bali. Sadurunge JDK 1.5, jinis data
int
lan Integer beda. Ing kasus overloading cara, rong jinis iki digunakake tanpa masalah. Kanthi tekane packing / unpacking otomatis, iki dadi luwih angel. Conto iki cara overloaded
remove()
ing
ArrayList
. Kelas
ArrayList
wis rong cara mbusak -
remove(index)
lan
remove(object)
. Ing kasus iki, metode overloading ora bakal kedadeyan lan metode sing cocog bakal diarani kanthi paramèter sing cocog.
Kesimpulan
Autoboxing minangka mekanisme kanggo ngowahi jinis data primitif kanthi implisit dadi kelas pembungkus sing cocog (obyek). Compiler nggunakake metode
valueOf()
kanggo ngowahi jinis primitif dadi obyek, lan metode
IntValue()
,
doubleValue()
lan liya-liyane, kanggo entuk jinis primitif obyek kasebut. Autoboxing ngowahi jinis boolean
boolean
dadi Boolean,
byte
dadi Byte,
char
dadi Karakter,
float
dadi Float,
int
dadi Integer,
long
dadi Long,
short
dadi Short. Unpacking occurs ing arah mbalikke.
Artikel asli
GO TO FULL VERSION