JavaRush /Блоги Java /Random-TG /Автобокс ва кушодан дар Java
Viacheslav
Сатҳи

Автобокс ва кушодан дар Java

Дар гурӯҳ нашр шудааст
<h2>Муқаддима</h2>Забони барномасозӣ, ба монанди забоне, ки одамон ҳарф мезананд, зиндагӣ мекунанд ва тағир меёбанд, дар он падидаҳои нав пайдо мешаванд, то ин забон барои истифода қулайтар шавад. Ва чунон ки мо медонем, забон бояд фикрҳои моро ба осонӣ баён кунад.
Автобокс ва кушодан дар Java - 1
Ҳамин тавр, дар Java SE 5, механизми бокс / unboxing ҷорӣ карда шуд. Ва як дарси алоҳида аз Oracle ба хусусиятҳои ин воситаи ифодаи фикрҳо бахшида шудааст: Autoboxing ва Unboxing . <h2>Бастани автоматии бокс</h2>Биёед як мисоли бастабандии худкори боксро бубинем. Аввалан, биёед бубинем, ки он чӣ гуна кор мекунад. Биёед сайти compilejava.net- ро истифода барем ва синф эҷод кунем:
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);
    }
}
Рамзи оддӣ. Мо метавонем параметри вурудро муайян кунем ва арзиши портро тағир диҳем. Чунон ки мебинем, зеро мо арзиши портро аз Stringпараметрҳо мехонем, мо Integerонро тавассути гирифтани он тавассути Integer.valueOf. Аз ин рӯ, мо маҷбур мешавем, ки онро на ҳамчун навъи ибтидоӣ, балки ҳамчун навъи an object муайян кунем Integer. Ва дар ин ҷо мо, аз як тараф, мо тағирёбандаи an object дорем ва арзиши пешфарз як ибтидоӣ аст. Ва он кор мекунад. Аммо мо ба ҷодугарӣ бовар намекунем, ҳамин тавр-не? Чи тавре ки мегуянд, «дар таги кулба»-ро дида бароем. Рамзи сарчашмаро аз compilejava.net бо клики "Зеркашии ZIP" зеркашӣ кунед. Пас аз он, архиви зеркашидашударо ба директория ҷудо кунед ва ба он равед. Акнун биёед кор кунем: javap -c -p App.classдар он ҷо App.class файли синфҳои тартибдодашуда барои синфи шумост. Мо мундариҷаи зеринро мебинем:
Автобокс ва кушодан дар Java - 2
Ин ҳамон "bytecodeи" маъруф аст. Аммо он чизе, ки ҳоло барои мо муҳим аст, он чизест, ки мо мебинем. Аввалан, примитиви 8080 дар стеки иҷрои метод ҷойгир карда мешавад ва сипас Integer.valueOf иҷро мешавад . Ин «сеҳри» бокс аст. Ва дар дохor ҷодугарӣ чунин менамояд:
Автобокс ва кушодан дар Java - 3
Яъне, аслан, вобаста ба арзиши адад аз кэш нав гирифта мешавад Integerё ба даст хоҳад омад (кэш танҳо массиви бутуни ададҳо нест). IntegerТабиист, ки Integerин кадар бахти на танхо як кас буд. Рӯйхати пурраи навъҳои ибтидоии алоқаманд ва печонидани онҳо мавҷуд аст (синфҳое, ки ибтидоиро дар ҷаҳони OOP намояндагӣ мекунанд). Ин рӯйхат дар поёни дастури Oracle оварда шудааст: " Autoboxing and Unboxing ". Дарҳол бояд қайд кард, ки массивҳое, ки аз ибтидоӣ сохта шудаанд, бидуни пайваст кардани ягон китобхонаи тарафи сеюм "печанда" надоранд. Онхое. аз 'с барои мо Arrays.asListнамесозад . <h2>Баровардани қуттӣ</h2>Раванди баръакс ба бокс кушодани қуттӣ номида мешавад. Биёед як мисоли кушодаро бубинем: int[]ListInteger
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.absтанҳо ибтидоиро қабул мекунад. Чӣ бояд кард? Синфи печанда барои ин ҳолат усули махсус дорад, ки ибтидоиро бармегардонад. Масалан, ин Integerусули intValue аст . Агар мо ба byte-code назар кунем, он чунин аст:
Автобокс ва кушодан дар Java - 4
Эҳтимол, ҷодугарӣ вуҷуд надорад. Ҳама чиз дар дохor Java аст. Он танҳо "худ" кор мекунад. Барои роҳати мо. <h2>Райк</h2>
Автобокс ва кушодан дар Java - 5
Ҳар як асбоб, агар нодуруст истифода шавад, силоҳи пурқуввати зидди худ мегардад. Ва механизми автоматии бокс / кушодан дар Java истисно нест. Аввалин, муқоисаи возеҳ тавассути ==. Ман фикр мекунам, ки ин равшан аст, аммо биёед бори дигар ба он назар андозем:
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
}
Дар ҳолати аввал, арзиш аз Integerкэши арзиш гирифта мешавад (нигаред ба шарҳи Бокс дар боло) ва дар ҳолати дуюм ҳар дафъа an objectи нав сохта мешавад. Аммо дар ин ҷо шумо бояд фармоиш диҳед. Ин рафтор аз сатҳи баланди кэш вобаста аст ( java.lang.Integer.IntegerCache.high ). Илова бар ин, ин маҳдудият метавонад бо сабаби танзимоти дигар тағир ёбад. Шумо метавонед муҳокимаро дар ин мавзӯъ дар stackoverflow хонед: Кэши Integer чӣ қадар калон аст? Табиист, ки an objectҳоро бо истифода аз баробарҳо муқоиса кардан лозим аст: System.out.println(notInCache.equals(notInCache2)); Мушкилоти дуюми марбут ба як механизм иҷроиш аст. Ҳама гуна бокс дар Java ба эҷоди an objectи нав баробар аст. Агар рақам ба арзишҳои кэш дохил нашавад (яъне -128 то 127), он гоҳ ҳар дафъа an objectи нав сохта мешавад. Агар ногаҳон бастабандӣ (яъне бокс) дар як ҳалқа анҷом дода шавад, ин боиси зиёд шудани an objectҳои нолозим ва сарфи захираҳо барои кори партовгоҳ мегардад. Аз ин рӯ, дар ин бора беэътиноӣ накунед. Сеюм, на камтар аз дардовар аз ҳамон механизм бармеояд:
public static void check(Integer value) {
    if (value <= 0) {
        throw new IllegalStateException("Value is too small");
    }
}
Дар ин code, шахс ба таври возеҳ кӯшиш мекард, ки хатогиро нагузаронад. Аммо ягон чек нест null. Агар сухан ба воридот равад null, пас ба ҷои хатои фаҳмо мо хатои нофаҳмо мегирем NullPointerException. Зеро барои муқоиса, Java кӯшиш мекунад, ки иҷро кунад value.intValueва суқут кунад, зеро ... valueхоҳад кард null. <h2>Хулоса</h2>Механизми бокс/унboxing ба барномасоз имкон медиҳад, ки codeи камтар нависад ва баъзан ҳатто дар бораи табдил додан аз ибтидоӣ ба an objectҳо ва бозгашт фикр намекунад. Аммо ин маънои онро надорад, ки шумо бояд чӣ гуна кор кардани онро фаромӯш кунед. Дар акси ҳол, шумо метавонед хато кунед, ки дарҳол пайдо нашавад. Мо набояд ба қисмҳои система, ки комилан таҳти назорати мо нестанд, такя кунем (масалан, сарҳади бутун). Аммо дар бораи ҳамаи бартариҳои синфҳои печанда фаромӯш накунед (ба монанди Integer). Аксар вақт ин синфҳои печанда дорои маҷмӯи усулҳои иловагии статикӣ мебошанд, ки ҳаёти шуморо беҳтар ва рамзи шуморо боз ҳам равшантар мегардонанд. Инак як мисоли мукаммал:
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'));
}
Хулосаи дуруст аз ҳама чиз ин аст, ки ҷодуе нест, як навъ амалӣ вуҷуд дорад. Ва на ҳама чиз ҳамеша он чизест, ки мо интизор ҳастем. Масалан, бастабандӣ вуҷуд надорад: System.out.println("The number is " + 8); Намунаи дар боло овардашуда аз ҷониби компилятор ба як сатр оптимизатсия карда мешавад. Яъне, гӯё шумо "Рақам 8 аст" навиштаед. Ва дар мисоли дар поён овардашуда низ бастабандӣ нахоҳад буд:
public static void main(String[] args) {
    System.out.println("The number is " + Math.abs(-2));
}
Вақте ки мо printlnan objectро ҳамчун вуруд қабул мекунем ва бояд хатҳоро бо ягон роҳ пайваст кунем. Хатҳо... бале, барои ҳамин чунин бастабандӣ вуҷуд надорад. Усулҳои статикӣ мавҷуданд Integer, аммо баъзеи онҳо package. Яъне мо онҳоро истифода бурда наметавонем, аммо дар худи Java онҳо метавонанд фаъолона истифода шаванд. Дар ин чо айнан хамин тавр аст. Усули getChars даъват карда мешавад, ки массиви аломатҳоро аз рақам месозад. Боз, ҷодуе нест, танҳо Java). Ҳамин тавр, дар ҳама гуна вазъияти норавшан, шумо бояд танҳо ба амалия назар кунед ва ҳадди аққал чизе ба ҷои худ меафтад. #Вячеслав
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION