Overview: Այս հոդվածում մենք կքննարկենք մասին autoboxing / Ապափաթեթավորում առանձնահատկությունն java. Autoboxing եւ Ապափաթեթավորում հիմնականում մի առանձնահատկություն է փոխարկել պարզունակ տիպեր օբյեկտների եւ հակադարձ. Ամբողջ գործընթացը կատարվում է ավտոմատ կերպով է java վազում ժամանակի միջավայրում. Բայց խնամք պետք է ձեռնարկվեն, իսկ իրականացման հնարավորությունը, հակառակ դեպքում դա պետք ազդեցություն դիմումի կատարման.
Ներածություն
Նախքան JDK 1.5, դա չի եղել հեշտ է փոխարկել պարզունակ տվյալների տեսակները, օր int, օրականով աշխատանք, float, կրկնապատկել են իրենց օբյեկտի համարժեքը - Ամբող թվերի, բնավորություն, բոց, Կրկնակի. JDK 5 եկավ առանձնահատկությունն ավտոմատ փոխակերպման նախնադարյան տիպերի մեջ իրենց օբյեկտ համարժեքը. Այս հատկությունը հայտնի է որպես autoboxing. Հակառակ այս հայտնի է որպես Ապափաթեթավորում. i.e. գործընթացը վերծանել օբյեկտների մեջ համապատասխան պարզունակ տվյալների տեսակները կոչվում Ապափաթեթավորում. Sample կոդը համար, այնպես էլ autoboxing եւ Ապափաթեթավորում է որպես տակ -
Autoboxing
[համար]
Ամբողջ թիվ ամբողջ թիվ = 9;
[/համար]
Ապափաթեթավորում
[համար]
int է = 0;
ի = նոր Integer(9);
[/համար]
Երբ Autoboxing եւ Ապափաթեթավորում օգտագործվում է?
Autoboxing կիրառվում է Java Կազմողի է հետեւյալ պայմաններով `
- Երբ մի պարզունակ արժեքը անցել է որպես պարամետր է մեթոդի, որը ակնկալում է օբյեկտ համապատասխան wrapper դասի.
- Երբ մի պարզունակ արժեքը, որը նշանակվում է մի փոփոխականի համապատասխան wrapper դասի.
Դիտարկենք հետեւյալ օրինակը.
Listing1: Sample կոդը ցույց Autoboxing
[համար]
հասարակական միջ sumEvenNumbers(Ցուցակ<ամբողջ թիվ> intList ) { int sum = 0; համար (ամբողջ թիվ i: intList ) եթե ( ես % 2 == 0 ) գումարը = i; return sum;}
[/համար]
Նախքան JDK 1.5, վերը նշված կոդը պատառներ կլիներ արդյունքում յուրացման սխալ, քանի որ մնացածն օպերատոր - '%', իսկ unary գումարած ' =' չի կարող կիրառվել է ամբողջ թվեր. Բայց քանի որ JDK 1.5 Այս կտոր կոդը կազմում եւ վարում է առանց որեւէ սխալի, քանի որ այն նորադարձների թիվ է int է Runtime.
Ապափաթեթավորում կիրառվում է Java Կազմողի է հետեւյալ պայմաններով `
- Երբ օբյեկտ, որը ընդունվել է որպես պարամետր է մեթոդի, որը ակնկալում է համապատասխան պարզունակ արժեքը.
- Երբ օբյեկտ, որը նշանակվում է փոփոխականի համապատասխան պարզունակ տեսակի
- Դիտարկենք հետեւյալ օրինակը.
Listing2: Sample կոդը ցույց Ապափաթեթավորում
[համար]
ներմուծման java.util.ArrayList;ներմուծման java.util.List; public class UnboxingCheck { հասարակական ստատիկ անվավեր հիմնական(Լար[] args) { Ամբողջ թիվ է = նոր Integer(-8); // 1. Unboxing through method invocation int absVal = absoluteValue( in ); System.out.println( “բացարձակ արժեք ” + in + ” = ” + absVal ); Ցուցակ<Կրկնակի> doubleList = new ArrayList<Կրկնակի>(); // It is autoboxed through method invocation. doubleList.add(3.1416); // 2. Unboxing through assignment double phi = doubleList.get(0); System.out.println( “Phi = ” + Phi ); } public static int absoluteValue( int i ) { return (ես < 0) ? -ես : ես; }}
[/համար]
Autoboxing եւ Ապափաթեթավորում թույլ է տալիս մշակողի գրելու ծածկագիր, որը շատ հեշտ է կարդալ եւ հասկանալ,. Հետեւյալ աղյուսակը ցույց է տալիս պարզունակ datatypes եւ նրանց համապատասխան երես օբյեկտները -
պրիմիտիվ տեսակը | փաթաթան Class |
բուլյան | Բուլյան |
byte | բայտ |
օրականով աշխատանք | բնավորություն |
float | բոց |
int | ամբողջ թիվ |
երկար | Երկար |
կարճ | կարճ |
Սեղան - 1: Primitive data type and their equivalent wrapper classes With Comparison operators
Autoboxing եւ Ապափաթեթավորում կարող է կատարվել համեմատական օպերատորների. Հետեւյալ կոդը պատառներ ցույց է տալիս, թե ինչպես դա կարող է անել,
Listing3: Sample կոդը ցույց Autoboxing եւ Ապափաթեթավորում օգտագործելով համեմատությունը օպերատորների
[համար]
հասարակական կարգի BoxedComparator {
հասարակական ստատիկ անվավեր հիմնական(Լար[] args) {
Ամբողջ թիվ է = նոր Integer(25);
եթե (in < 35)
System.out.println(“Արժեքը int = ” + in);
}
}
[/համար]
Autoboxing եւ Ապափաթեթավորում հետ եղանակով գերբեռնվածության
Autoboxing կամ Ապափաթեթավորում է արվում դեպքում մեթոդը գերբեռնվածության. Սա տեղի է ունենում հիմնված է հետեւյալ կանոնների
- Ընդլայնման դիպչում բռնցքամարտ - Երբ կա մի իրավիճակ, ընտրել միջեւ ընդլայնման եւ բռնցքամարտում, լայնացում տանում է նախապատվությունը -
Listing4: Sample կոդը ցույց ծանրացնելու նախապատվությունը
[համար]
հասարակական կարգի WideBoxed { հասարակական կարգի WideBoxed { static void methodWide(int i) { System.out.println(“int”); } static void methodWide( ամբողջ թիվ i ) { System.out.println(“ամբողջ թիվ”); } հասարակական ստատիկ անվավեր հիմնական(Լար[] args) { short shVal = 25; methodWide(shVal); } }}
[/համար]
Ի արտադրանքը Այս ծրագրի է, int
- Ընդլայնման դիպչում Varargs - Երբ կա մի իրավիճակ, ընտրել միջեւ ընդլայնման եւ varargs, լայնացում տանում է նախապատվությունը -
Listing5: Sample կոդը ցույց ծանրացնելու նախապատվությունը
[համար]
հասարակական կարգի WideVarArgs {
static void methodWideVar(int I1, int i2) {
System.out.println(“int int”);
}
static void methodWideVar(ամբողջ թիվ… ես) {
System.out.println(“ամբողջ թիվ”);
} հասարակական ստատիկ անվավեր հիմնական( Լար[] args) {
կարճ shVal1 = 25;
կարճ shVal2 = 35;
methodWideVar( shVal1, shVal2);
}
}
[/համար]
- Բռնցքամարտի դիպչում Varargs - Երբ կա մի իրավիճակ, ընտրել միջեւ բռնցքամարտի եւ varargs, Բռնցքամարտի տանում է նախապատվությունը -
Listing6: Sample կոդը ցույց ծանրացնելու նախապատվությունը
[համար]
հասարակական կարգի BoxVarargs {
static void methodBoxVar(ամբողջ թիվ է) {
System.out.println(“ամբողջ թիվ”);
}
static void methodBoxVar(ամբողջ թիվ… ես) {
System.out.println(“ամբողջ թիվ”);
}
հասարակական ստատիկ անվավեր հիմնական(Լար[] args) {
int intVal1 = 25;
methodBoxVar(intVal1);
}
}
[/համար]
Things է հիշել, որպեսզի օգտագործել Autoboxing -
Քանի որ մենք գիտենք, որ ամէն բարի հատկությունը գալիս որոշ թերություններ, Autoboxing բացառություն չէ այս առումով. Որոշ կարեւոր փամփուշտ, որը ծրագրավորողը պետք է պահել մտքում, երբ, օգտագործելով այս առանձնահատկությունն են, քանի որ մինչեւ
- Համեմատելով օբյեկտների հետ հավասարության օպերատոր - հավասարության օպերատոր '==' հանգեցնում է շփոթության, քանի որ այն կարող է կիրառվել երկու պարզունակ տիպերի եւ օբյեկտի. Երբ օպերատորը կիրառվում օբյեկտների, այն իրականում համեմատում է տեղեկանք օբյեկտների եւ ոչ այն արժեքները.
Listing7: Sample կոդը ցույց համեմատությունը
[համար]
հասարակական կարգի Comparator {
հասարակական ստատիկ անվավեր հիմնական(Լար[] args) {
Բնազդ Integer = new Integer(1);
Ամբողջ թիվ secondInt = new ամբողջ թիվ(1);
եթե (== Բնազդ secondInt) {
System.out.println(“երկուսն մեկը հավասար են”);
} else {
System.out.println(“Երկուսն էլ մեկը հավասար չեն”);
}
}
}
[/համար]
- Mixing օբյեկտը եւ պարզունակ է հավասարության եւ հարաբերման օպերատոր - Եթե մենք համեմատենք մի պարզունակ տվյալների տեսակ առարկայի, ապա Ապափաթեթավորում տեղի է ունենում, որոնք կարող են շպրտել մի NullPointerException, եթե օբյեկտը ոլորտում..
- Պահված որոնում - Քանի որ valueOf()մեթոդը օգտագործվում է ստեղծել boxed պարզունակ օբյեկտները, օգտագործված օբյեկտների վերցված են քեշից. Քանի որ Java caches թիվ են -128 to 128, այդ Պահված օբյեկտները կարող են վարվել այլ կերպ.
- Performance դեգրադացիան - Autoboxing կամ Ապափաթեթավորում նվաստացնում կատարումը դիմումի, քանի որ այն ստեղծում է անցանկալի օբյեկտ, որը տանում է GC է առաջադրվել ավելի հաճախ.
Անբարենպաստ Autoboxing
Չնայած նրան, որ autoboxing ունի մի շարք առավելություններ, այն ունի հետեւյալ թերությունը -
- Եթե autoboxing տեղի է ունենում մի հանգույց ավելորդ օբյեկտների ստանում ստեղծվել, եւ դա կարող է դանդաղեցնել կատարումը դիմումի. Դիտարկենք հետեւյալ կոդը `
Listing8: Sample կոդը ցույց կատարման հարցը
[համար]
հասարակական միջ sumEvenNumbers(Ցուցակ<ամբողջ թիվ> intList) { int sum = 0; համար (ամբողջ թիվ i: intList) եթե ( ես % 2 == 0 ) գումարը = i; return sum;}
[/համար]
Այս կտոր օրենսգրքի, [համար] գումարը = i; [/համար] կընդլայնի է որպես [համար] գումարը = գումարը + ես; [/համար]. Քանի որ « գործողությունը չի կարող կատարվել է Integer օբյեկտի, որ JVM triggers է Ապափաթեթավորում գումարի Integer առարկաներ եւ ապա արդյունքը autoboxed ետ.
- Նախքան JDK 1.5, տվյալների տեսակները int եւ Integer էին հստակ եւ դեպքում մեթոդի գերբեռնվածության այդ երկու տեսակի են օգտագործվել առանց hassle. Այժմ autoboxing եւ Ապափաթեթավորում, սա դարձել trickier. Որպես օրինակ է գերծանրաբեռնված հեռացնել մեթոդը ArrayList. Մանրամասն ArrayList ունի երկու հեռացնել մեթոդներ - հեռացնել (ինդեքս) եւ հեռացնել (object). In this case, մեթոդը ծանրաբեռնելը տեղի չի ունենա, իսկ համապատասխան մեթոդը կկոչվի համապատասխան պարամետրերի.
Ամփոփում
Autoboxing է մեխանիզմը քողարկված պարզունակ տվյալների տեսակի մեջ համապատասխան շապիկ կամ օբյեկտ. Կազմողի օգտագործում valueOf() մեթոդը է փոխարկել պարզունակ առարկել եւ օգտագործում intValue(), doubleValue() եւ այլն է ստանալ պարզունակ արժեք օբյեկտ. ի autoboxing, Բուլյան փոխարկվում է Բուլյան, բայթ է բայտ, char է Նիշերի, float changes to Float, int գնում է Integer, երկար գնում է երկար ու կարճ նորադարձների կարճ, իսկ Ապափաթեթավորում դարձի տեղի է ունենում հակառակ ուղղությամբ.