JavaRush /Blog Jawa /Random-JV /Autoboxing lan unboxing ing Jawa
Viacheslav
tingkat

Autoboxing lan unboxing ing Jawa

Diterbitake ing grup
<h2>Pambuka</h2>Basa pamrograman, kaya basa sing diucapake wong, urip lan owah-owahan, fenomena anyar katon ing basa kasebut supaya basa kasebut luwih trep kanggo digunakake. Lan kita ngerti, basa kudu trep kanggo mratelakake panemume kita.
Autoboxing lan unboxing ing Jawa - 1
Dadi, ing Java SE 5, mekanisme tinju / unboxing dikenalake. Lan tutorial sing kapisah saka Oracle dikhususake kanggo fitur-fitur saka cara iki kanggo nyebut pikirane: Autoboxing lan Unboxing . <h2>Tinju Pengemasan Otomatis</h2>Ayo dideleng conto Tinju Pengemasan Otomatis. Pisanan, ayo ndeleng cara kerjane. Ayo nggunakake situs compilejava.net lan nggawe kelas:
public class App {
    public static void main(String[] args) {
        Integer portNumber = 8080;
        if (args.length != 0) {
            portNumber = Integer.valueOf(args[0]);
        }
        System.out.println("Port number is: " + portNumber);
    }
}
Kode prasaja. Kita bisa nemtokake parameter input lan ngganti nilai port. Kaya sing kita deleng, amarga kita maca Nilai port saka Stringparamèter, kita njaluk Integeriku dening njupuk liwat Integer.valueOf. Mulane, kita dipeksa kanggo nemtokake ora minangka jinis primitif, nanging minangka jinis obyek Integer. Lan ing kene kita entuk ing tangan siji, kita duwe variabel obyek, lan nilai standar minangka primitif. Lan kerjane. Nanging kita ora percaya ing sihir, ta? Ayo goleki "ing hood," kaya sing diomongake. Download kode sumber saka compilejava.net kanthi ngeklik "Download ZIP". Sawisé iku, extract arsip sing diundhuh menyang direktori lan pindhah menyang. Saiki ayo nglakoni: javap -c -p App.classngendi App.class minangka file kelas sing dikompilasi kanggo kelas sampeyan. Kita bakal weruh isi kaya iki:
Autoboxing lan unboxing ing Jawa - 2
Iki padha kondhang "bytecode". Nanging sing penting kanggo kita saiki yaiku apa sing kita deleng. Pisanan, primitif 8080 diselehake ing tumpukan eksekusi metode, banjur Integer.valueOf dieksekusi . Iki minangka "sihir" tinju. Lan ing njero sihir katon kaya iki:
Autoboxing lan unboxing ing Jawa - 3
Sing, ing intine, sing anyar bakal dijupuk Integerutawa bakal dipikolehi Integersaka cache (cache ora luwih saka mung array Integer) gumantung saka nilai nomer kasebut. Mesthi, Integerora mung siji sing begja. Ana dhaptar kabeh jinis primitif sing gegandhengan lan bungkuse (kelas sing makili primitif ing jagad OOP). Dhaptar iki diwenehake ing sisih ngisor Tutorial saka Oracle: " Autoboxing lan Unboxing ". Perlu dicathet yen susunan sing digawe saka primitif ora duwe "pembungkus" tanpa nyambungake perpustakaan pihak katelu. Sing. Arrays.asListora bakal nggawe saka int[]kanggo kita Listsaka Integer's. <h2>Unboxing</h2>Proses mbalikke menyang boxing diarani unboxing unboxing. Ayo ndeleng conto unpacking:
public class App {

    public static void main(String[] args) {
        if (args.length == 0) {
            System.out.println("Please, enter params");
            return;
        }
      	int value = Math.abs(Integer.valueOf(args[0]));
        System.out.println("Absolute value is: " + value);
    }

}
Math.absmung nampa primitif. Apa sing kudu ditindakake? Kelas pambungkus duwe cara khusus kanggo kasus iki sing ngasilake primitif. Contone, iki Integercara intValue . Yen kita ndeleng bytecode, kaya iki:
Autoboxing lan unboxing ing Jawa - 4
Ketoke, ora ana sihir. Kabeh ana ing Jawa. Iku mung dianggo "kanthi dhewe". Kanggo penak kita. <h2>Rake</h2>
Autoboxing lan unboxing ing Jawa - 5
Alat apa wae, yen digunakake kanthi ora bener, dadi senjata sing nggegirisi marang awake dhewe. Lan mekanisme boxing/unboxing otomatis ing Jawa ora istiméwa. Sing pertama, perbandingan sing jelas yaiku liwat ==. Aku iki jelas, nanging ayo dideleng maneh:
public static void main(String[] args) {
    Integer inCacheValue = 127;
    Integer inCacheValue2 = 127;
    Integer notInCache = 128; // new Integer(129)
    Integer notInCache2 = 128; // new Integer(129)
    System.out.println(inCacheValue == inCacheValue2); //true
    System.out.println(notInCache == notInCache2); //false
}
Ing kasus sing sepisanan, nilai kasebut dijupuk saka Integercache nilai (pirsani panjelasan Boxing ing ndhuwur), lan ing kasus kapindho obyek anyar bakal digawe saben wektu. Nanging ing kene iku worth nggawe leladen. Prilaku iki gumantung ing cache dhuwur bound ( java.lang.Integer.IntegerCache.high ). Kajaba iku, watesan iki bisa diganti amarga setelan liyane. Sampeyan bisa maca diskusi ing topik iki ing stackoverflow: Carane gedhe cache Integer? Alamiah, obyek kudu dibandhingake nggunakake witjaksono: System.out.println(notInCache.equals(notInCache2)); Masalah kapindho gadhah mekanisme padha kinerja. Sembarang tinju ing Jawa padha karo nggawe obyek anyar. Yen nomer kasebut ora kalebu ing nilai cache (yaiku -128 nganti 127), banjur obyek anyar bakal digawe saben wektu. Yen dumadakan packaging (i.e. boxing) dileksanakake ing daur ulang, iki bakal nimbulaké Tambah ageng ing obyek rasah lan konsumsi sumber daya kanggo karya kolektor sampah. Mula, aja nganti sembrono. Kaping telu, rake sing ora kurang nyeri asale saka mekanisme sing padha:
public static void check(Integer value) {
    if (value <= 0) {
        throw new IllegalStateException("Value is too small");
    }
}
Ing kode iki, wong kasebut kanthi jelas nyoba ora ngliwati kesalahan kasebut. Nanging ora ana sing mriksa null. Yen nerangake input null, banjur tinimbang kesalahan sing bisa dingerteni, kita bakal entuk kesalahan sing ora bisa dingerteni NullPointerException. Amarga kanggo mbandhingake, Jawa bakal nyoba nglakokake value.intValuelan nabrak, amarga ... valuebakal null. <h2> Kesimpulan</h2>Mekanisme boxing/unboxing ngidini programmer nulis kode sing kurang lan kadhangkala ora mikir babagan ngowahi saka primitif menyang obyek lan bali. Nanging iki ora ateges sampeyan kudu lali cara kerjane. Yen ora, sampeyan bisa nggawe kesalahan sing ora katon langsung. Kita ora kudu ngandelake bagean sistem sing ora bisa dikontrol (kayata wates integer). Nanging aja lali babagan kabeh kaluwihan kelas pambungkus (kaya Integer). Asring kelas pambungkus iki duwe set metode statis tambahan sing bakal nggawe urip luwih apik lan kode sampeyan luwih ekspresif. Ing ngisor iki tuladha panyebaran:
public static void main(String[] args) {
    int first = 1;
    int second = 5;
    System.out.println(Integer.max(first, second));
    System.out.println(Character.toLowerCase('S'));
}
Kesimpulan sing bener saka kabeh yaiku ora ana sihir, ana sawetara realisasi. Lan ora kabeh mesthi bakal kaya sing dikarepake. Contone, ora ana kemasan: System.out.println("The number is " + 8); Conto ing ndhuwur bakal dioptimalake dening compiler dadi siji baris. Yaiku, kaya-kaya sampeyan nulis "Nomer kasebut 8". Lan ing conto ing ngisor iki ora bakal ana kemasan:
public static void main(String[] args) {
    System.out.println("The number is " + Math.abs(-2));
}
Carane bisa nalika kita printlnnjupuk obyek minangka input lan kudu piye wae nyambung garis. Garis-garis... ya, mulane ora ana kemasan kaya ngono. Ana Integercara statis, nanging sawetara ana package. Tegese, ora bisa digunakake, nanging ing Jawa dhewe bisa digunakake kanthi aktif. Iki persis ing kene. Cara getChars bakal diarani, sing nggawe macem-macem karakter saka nomer kasebut. Maneh, ora ana sihir, mung Jawa). Dadi ing kahanan sing ora jelas, sampeyan mung kudu ndeleng implementasine lan paling ora ana sing bakal ditindakake. #Viacheslav
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION