A Java egy viszonylag egyszerű és könnyen használható nyelv. Ennek ellenére programozás során könnyen bele lehet futni furcsa dolgokat produkáló kódba. A következő példa jól mutatja, hogy milyen veszélyeket rejt, ha nem minden esetben követjük a nyelv íratlan szabályait. A specifikáció apró részleteiről, illetve a fordító/futtató környezet apróságairól már jobb nem is beszélni.
A következő kódrészlet az int-Integer autoboxing-ot (dobozolás) mutatja be. Az int számok átkonvertálása Integer-ré elég költséges dolog. Amikor pedig többszörös konverziót hajtunk végre vagy egy hosszú ciklusban használunk ilyesmit akkor érezzük magunkat rosszul. A dobozolás egy lassú folyamat.
A következő kódrészlet egy egyszerű dobozolási példát mutat be. A kérdés, hogy mit ír ki?
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 2000;
Integer i4 = 2000;
if (i1 == i2) {
System.out.println("i1 es i2 megegyezik.");
}
if (i3 == i4) {
System.out.println("i3 es i4 megegyezik.");
}
A nyelv fejlesztői tisztában voltak azzal, hogy a dobozolás nincs ingyen; ezért is alkalmaztak gyorsítást. Ennek az a lényege, hogy -128 és alapesetben 127 között az int Integer-ré alakítása során már előre legyártott értékeket ad vissza a dobozoló. Így már érthető lesz a programrészlet fura kimenete. Tehát aki arra tippelt, hogy az "i1 es i2 megegyezik" jelenik meg a kimeneten az jutalmul megnézheti az anomáliát előidéző kódrészletet az Integer osztályból:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
Tanulság: két objektum egyezőségének vizsgálatára mindig az equals() függvényt használjuk, sose az objektumok esetében csak referenciák összehasonlítására szolgáló '==' jelet.
Utolsó kommentek