Дар ин мақола мо хусусиятеро дар Java дида мебароем, ки бо номи
autoboxing/unboxing . Autoboxing ва unboxing вазифаи табдил додани намудҳои ибтидоӣ ба намудҳои an object ва баръакс мебошад.
Тамоми раванд ба таври худкор аз ҷониби Java Runtime Environment (JRE) иҷро карда мешавад. Аммо ҳангоми татбиқи ин функсия шумо бояд эҳтиёт бошед, зеро... Он метавонад ба иҷрои барномаи шумо таъсир расонад.
Муқаддима
int
Дар versionҳои поёнии JDK 1.5 табдил додани намудҳои ибтидоии додаҳо ба монанди ,
char
,
float
,
double
ба синфҳои сарпӯши онҳо Integer, Character, Float, Double осон набуд . Аз JDK 5 сар карда, ин функсия, табдил додани намудҳои ибтидоӣ ба an objectҳои баробар, ба таври худкор амалӣ карда мешавад.
Ин амвол бо номи Autoboxing маълум аст . Раванди баръакс, мутаносибан,
Unboxing , яъне. раванди табдил додани an objectҳо ба навъҳои ибтидоии онҳо. Рамзи намунавӣ барои autoboxing ва unboxing дар зер оварда шудааст:
Autoboxing
Integer integer = 9;
Кушодани қуттӣ
int in = 0;
in = new Integer(9);
Бастабандии худкор ва кушодан кай истифода мешавад? Autoboxing аз ҷониби компилятори Java дар шароити зерин истифода мешавад:
- Вақте ки арзиши навъи ибтидоӣ ба усул ҳамчун параметри усул интиқол дода мешавад, ки an objectи синфи мувофиқро интизор аст.
- Вақте ки арзиши навъи ибтидоӣ ба тағирёбандаи синфи печи мувофиқ таъин карда мешавад.
Мисоли зеринро дида бароед:
Рӯйхати 1: Рамзи оддӣ, ки автобоксро нишон медиҳад
public int sumEvenNumbers(List<Integer> intList ) {
int sum = 0;
for (Integer i: intList )
if ( i % 2 == 0 )
sum += i;
return sum;
}
Пеш аз jdk 1.5, рамзи дар боло овардашуда боиси хатогиҳои компиляция мешуд, зеро оператори боқимондаи % ва unary plus += ба синфи печанда татбиқ карда намешавад. Аммо дар jdk 1.5 ва болотар ин code бе хато тартиб дода, бутунро ба
int
. Unboxing аз ҷониби компилятори Java дар шароити зерин истифода мешавад:
- Вақте ки an object ҳамчун параметр ба усуле интиқол дода мешавад, ки намуди ибтидоии мувофиқро интизор аст.
- Вақте ки an object ба тағирёбандаи навъи ибтидоии мувофиқ таъин карда мешавад.
Мисоли зеринро дида бароед:
Рӯйхати 2: Рамзи оддӣ, ки кушодани қуттиро нишон медиҳад
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 ва unboxing ба таҳиякунанда имкон медиҳад, ки codeеро нависад, ки хондан ва фаҳмидан осон аст. Дар ҷадвали зерин намудҳои маълумотҳои ибтидоӣ ва an objectҳои сарпӯши мувофиқи онҳо нишон дода шудаанд.
Навъҳои ибтидоӣ |
Синфҳои Shell |
булӣ |
Булӣ |
byte |
Байт |
char |
Характер |
шино кардан |
шино кардан |
int |
Бутун |
дароз |
дароз |
кӯтоҳ |
Кӯтоҳ |
Љадвали 1: Намудњои ибтидої ва синфњои печонидани муодor бо операторњои муќоиса Autoboxing ва unboxing метавонанд бо операторњои муќоиса истифода шаванд. Парчами codeи зерин нишон медиҳад, ки ин чӣ гуна рух медиҳад:
Рӯйхати 3: Рамзи намунавӣ, ки бо оператори муқоисавӣ автоматӣ ва кушодани қуттиҳоро нишон медиҳад
public class BoxedComparator {
public static void main(String[] args) {
Integer in = new Integer(25);
if (in < 35)
System.out.println("Value of int = " + in);
}
}
Автоматборкунӣ ва кушодан ҳангоми аз ҳад зиёд бор кардани усул Автоматборкунӣ ва кушодан ҳангоми пурборкунии усул дар асоси қоидаҳои зерин амалӣ карда мешавад:
- Васеъшавӣ бастабандро дар вазъияте "мағлуб мекунад", ки интихоби байни васеъкунӣ ва бастабандӣ вуҷуд дорад; тавсеа афзалтар аст.
Рӯйхати 4: Рамзи намунавӣ, ки манфиати изофабориро нишон медиҳад
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);
}
}
}
Натиҷаи барнома - навъи
int
- Тавсеа шумораи тағйирёбандаи аргументҳоро мезанад Дар вазъияте, ки он интихоби байни васеъкунӣ ва шумораи тағйирёбандаи аргументҳо мегардад, тавсеа афзалтар аст.
Рӯйхати 5: Рамзи намунавӣ, ки манфиати изофабориро нишон медиҳад
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);
}
}
- Бастабандӣ шумораи тағйирёбандаи аргументҳоро мезанад Дар вазъияте, ки он интихоби байни бастабандӣ ва шумораи тағйирёбандаи аргументҳо мегардад, бастабандӣ афзалтар аст.
Рӯйхати 6: Рамзи намунавӣ, ки манфиати изофабориро нишон медиҳад
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);
}
}
Ҳангоми истифодаи Auto Packing, шумо бояд чизҳои зеринро дар хотир нигоҳ доред: Тавре ки мо медонем, ҳар як хусусияти хуб як нуқсон дорад. Бастабандии автомобилӣ дар ин маврид истисно нест. Баъзе ёддоштҳои муҳиме, ки таҳиягар ҳангоми истифодаи ин хусусият бояд дар хотир дошта бошад:
- Муқоисаи an objectҳо бо
==
оператори ' ' метавонад печида бошад, зеро он метавонад ба намудҳо ва an objectҳои ибтидоӣ татбиқ карда шавад. Вақте ки ин оператор ба an objectҳо истифода мешавад, он воқеан истинодҳоро ба an objectҳо муқоиса мекунад, на худи an objectҳо.
Рӯйхати 7: Рамзи намунавӣ, ки муқоисаро нишон медиҳад.
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");
}
}
}
- Омезиши an objectҳо ва намудҳои ибтидоӣ бо операторҳои баробарӣ ва релятсионӣ. Агар мо як навъи ибтидоиро бо an object муқоиса кунем, он гоҳ an object қутти нест, ки метавонад партояд,
NullPointerException
агар an objectи null
.
- Кэшкунии an object. Ин усул
valueOf()
як контейнери an objectҳои ибтидоиро эҷод мекунад, ки онро кэш мекунад. Азбаски арзишҳо дар диапазони -128 то 127, аз ҷумла, кэш карда мешаванд, ин an objectҳои кэшшуда метавонанд ба таври дигар рафтор кунанд.
- Пастшавии самаранокӣ. Autoboxing ё unboxing кори барномаро паст мекунад, зеро он an objectи номатлуберо эҷод мекунад, ки коллектори ахлотро маҷбур мекунад, ки зуд-зуд кор кунад.
Камбудиҳои AutoBoxing Гарчанде ки AutoBoxing як қатор афзалиятҳо дорад, он камбудиҳои зерин дорад:
Рӯйхати 8: Рамзи намунавӣ, ки масъалаи иҷроишро нишон медиҳад.
public int sumEvenNumbers(List intList) {
int sum = 0;
for (Integer i : intList) {
if (i % 2 == 0) {
sum += i;
}
}
return sum;
}
Дар ин фасли code
sum +=i
он ба васеъ карда мешавад
sum = sum + i
. Аз
+
оператори ' ' сар карда, JVM кушоданро оғоз мекунад, зеро
+
оператори ' ' ба an objectи Integer татбиқ карда намешавад. Ва он гоҳ натиҷа ба таври худкор бозпас гирифта мешавад. Пеш аз JDK 1.5, намудҳои додаҳо
int
ва Integer гуногун буданд. Дар сурати аз ҳад зиёди усул, ин ду намуд бе мушкилот истифода мешуданд. Бо пайдоиши бастабандии автоматӣ / кушодан, ин мушкилтар шуд. Мисоли ин усули изофабор
remove()
дар
ArrayList
. Синф
ArrayList
ду усули нест кардан дорад -
remove(index)
ва
remove(object)
. Дар ин ҳолат, изофабории усул ба амал намеояд ва усули мувофиқ бо параметрҳои мувофиқ даъват карда мешавад.
Хулоса
Autoboxing як механизми ба таври ғайримустақим табдил додани намудҳои ибтидоии додаҳо ба синфҳои (an objectҳои) мувофиқи бастабандӣ мебошад. Тартибдиҳанда усули
valueOf()
табдил додани намудҳои ибтидоиро ба an objectҳо ва усулҳои
IntValue()
,
doubleValue()
ва ғайраро барои ба даст овардани намудҳои ибтидоии an object истифода мебарад. Autoboxing намуди логикиро
boolean
ба мантиқӣ,
byte
ба byte,
char
ба аломат,
float
ба шинокунанда, ба
int
бутун,
long
дароз,
short
ба кӯтоҳ табдил медиҳад. Кушодан дар самти баръакс сурат мегирад.
Мақолаи аслӣ
GO TO FULL VERSION