JavaRush /جاوا بلاگ /Random-UR /جاوا میں آٹو باکسنگ اور ان باکسنگ
DSergey_Kh
سطح

جاوا میں آٹو باکسنگ اور ان باکسنگ

گروپ میں شائع ہوا۔
اس مضمون میں ہم جاوا میں ایک خصوصیت دیکھیں گے جسے autoboxing/unboxing کہتے ہیں ۔ آٹو باکسنگ اور ان باکسنگ قدیم اقسام کو آبجیکٹ کی قسموں میں تبدیل کرنے کا کام ہے اور اس کے برعکس۔ جاوا میں آٹو باکسنگ اور ان باکسنگ - 1یہ پورا عمل جاوا رن ٹائم انوائرمنٹ (JRE) کے ذریعے خود بخود انجام پاتا ہے۔ لیکن آپ کو اس فنکشن کو لاگو کرتے وقت محتاط رہنا چاہئے، کیونکہ... یہ آپ کے پروگرام کی کارکردگی کو متاثر کر سکتا ہے۔

تعارف

JDK 1.5 سے نیچے کے ورژن میں، ابتدائی ڈیٹا کی اقسام جیسے کہ int, char, کو ان کی ریپر کلاس انٹیجر، کریکٹر، فلوٹ، ڈبل میں تبدیل کرنا آسان نہیں تھا۔ JDK 5 سے شروع کرتے ہوئے، یہ فعالیت، قدیم اقسام کو مساوی اشیاء میں تبدیل کرنا، خود بخود لاگو ہوتا ہے۔ اس پراپرٹی کو آٹو باکسنگ کے نام سے جانا جاتا ہے ۔ الٹا عمل، بالترتیب، Unboxing ہے ، یعنی اشیاء کو ان کی متعلقہ قدیم اقسام میں تبدیل کرنے کا عمل۔ آٹو باکسنگ اور ان باکسنگ کے لیے نمونہ کوڈ ذیل میں دیا گیا ہے: آٹو باکسنگfloatdouble
Integer integer = 9;
ان باکسنگ
int in = 0;
in = new Integer(9);
آٹو پیکنگ اور پیک کھولنا کب استعمال ہوتا ہے؟ آٹو باکسنگ کو جاوا کمپائلر مندرجہ ذیل شرائط کے تحت استعمال کرتا ہے۔
  • جب ایک قدیم قسم کی قدر کو طریقہ پیرامیٹر کے طور پر ایک طریقہ میں منتقل کیا جاتا ہے، جو متعلقہ ریپر کلاس کے کسی شے کی توقع کرتا ہے۔
  • جب ایک قدیم قسم کی قدر متعلقہ ریپر کلاس کے متغیر کو تفویض کی جاتی ہے۔
درج ذیل مثال پر غور کریں: فہرست 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 اور اس سے اوپر میں یہ کوڈ بغیر کسی غلطی کے مرتب کرتا ہے، Integer کو int. ان باکسنگ کو جاوا کمپائلر درج ذیل شرائط کے تحت استعمال کرتا ہے۔
  • جب کسی چیز کو پیرامیٹر کے طور پر کسی ایسے طریقہ پر منتقل کیا جاتا ہے جس سے متعلقہ قدیم قسم کی توقع ہوتی ہے۔
  • جب کسی چیز کو متعلقہ قدیم قسم کے متغیر کو تفویض کیا جاتا ہے۔
مندرجہ ذیل مثال پر غور کریں: فہرست 2: سادہ کوڈ ان باکسنگ دکھا رہا ہے۔
import java.util.ArrayList;
import java.util.List;

public class UnboxingCheck {

public static void main(String[] args) {
Integer in = new Integer(-8);

// 1. Распаковка через вызов метода
int absVal = absoluteValue(in);
System.out.println("absolute value of " + in + " = " + absVal);

List<Double> doubleList = new ArrayList<Double>();

// Автоупаковка через вызов метода
doubleList.add(3.1416);

// 2. Распаковка через присвоение
double phi = doubleList.get(0);
System.out.println("phi = " + phi);
}

public static int absoluteValue(int i) {
return (i < 0) ? -i : i;
}
}
آٹو باکسنگ اور ان باکسنگ ڈویلپر کو کوڈ لکھنے کی اجازت دیتی ہے جو پڑھنے اور سمجھنے میں آسان ہے۔ درج ذیل جدول قدیم ڈیٹا کی اقسام اور ان سے متعلقہ ریپر اشیاء کو دکھاتا ہے۔
قدیم اقسام شیل کلاسز
بولین بولین
بائٹ بائٹ
چار کردار
تیرنا تیرنا
int عدد
طویل لمبی
مختصر مختصر
جدول 1: موازنہ آپریٹرز کے ساتھ قدیم اقسام اور مساوی ریپر کلاسز آٹو باکسنگ اور ان باکسنگ کو موازنہ آپریٹرز کے ساتھ استعمال کیا جا سکتا ہے۔ درج ذیل کوڈ کا ٹکڑا واضح کرتا ہے کہ یہ کیسے ہوتا ہے: فہرست 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);
    }
}
آٹو پیکنگ کا استعمال کرتے وقت آپ کو درج ذیل باتوں کو ذہن میں رکھنا چاہیے: جیسا کہ ہم جانتے ہیں، ہر اچھی خصوصیت میں ایک خرابی ہوتی ہے۔ آٹو پیکیجنگ اس سلسلے میں کوئی استثنا نہیں ہے۔ کچھ اہم نوٹ جو ایک ڈویلپر کو اس خصوصیت کا استعمال کرتے وقت ذہن میں رکھنا چاہئے:
  • ' ' آپریٹر کے ساتھ اشیاء کا موازنہ کرنا ==الجھن کا باعث ہو سکتا ہے، کیونکہ اس کا اطلاق قدیم اقسام اور اشیاء پر کیا جا سکتا ہے۔ جب یہ آپریٹر اشیاء پر لاگو ہوتا ہے، تو یہ اصل میں اشیاء کے حوالہ جات کا موازنہ کرتا ہے، نہ کہ خود اشیاء سے۔
فہرست 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");
      }
   }
}
  • مساوات اور رشتہ دار آپریٹرز کے ساتھ اشیاء اور قدیم اقسام کو ملانا۔ اگر ہم ایک قدیم قسم کا کسی آبجیکٹ سے موازنہ کریں، تو آبجیکٹ ان باکس شدہ ہے، جو پھینک سکتا ہے NullPointerExceptionاگر آبجیکٹ null۔
  • آبجیکٹ کیشنگ۔ یہ طریقہ valueOf()قدیم اشیاء کا ایک کنٹینر بناتا ہے جسے یہ کیش کرتا ہے۔ چونکہ اقدار -128 سے 127 کی حد میں کیش شدہ ہیں، بشمول، یہ کیش شدہ اشیاء مختلف طریقے سے برتاؤ کر سکتی ہیں۔
  • کارکردگی میں کمی۔ آٹو باکسنگ یا ان باکسنگ ایپلی کیشن کی کارکردگی کو کم کرتی ہے کیونکہ یہ ایک ناپسندیدہ چیز بناتی ہے جو کوڑا اٹھانے والے کو زیادہ کثرت سے چلانے پر مجبور کرتی ہے۔
آٹو باکسنگ کے نقصانات اگرچہ آٹو باکسنگ کے بہت سے فوائد ہیں، لیکن اس کے درج ذیل نقصانات ہیں: فہرست 8: نمونہ کوڈ جو کارکردگی کا مسئلہ دکھاتا ہے۔
public int sumEvenNumbers(List intList) {
          int sum = 0;
          for (Integer i : intList) {
              if (i % 2 == 0) {
                  sum += i;
              }
          }
         return sum;
   }
کوڈ کے اس حصے میں، sum +=i اسے sum = sum + i. ' +' آپریٹر کے ساتھ شروع کرتے ہوئے، JVM ان باکسنگ شروع کرتا ہے کیونکہ ' +' آپریٹر کو انٹیجر آبجیکٹ پر لاگو نہیں کیا جا سکتا ہے۔ اور پھر نتیجہ آٹو پیک ہو جاتا ہے۔ JDK 1.5 سے پہلے، ڈیٹا کی اقسام intاور انٹیجر مختلف تھے۔ طریقہ اوورلوڈنگ کے معاملے میں، یہ دو قسمیں بغیر کسی پریشانی کے استعمال کی گئیں۔ خودکار پیکنگ/ان پیکنگ کی آمد کے ساتھ، یہ مزید مشکل ہو گیا ہے۔ remove()اس کی ایک مثال میں اوور لوڈ شدہ طریقہ ہے ArrayList۔ کلاس میں ArrayListحذف کرنے کے دو طریقے ہیں - remove(index)اور remove(object). اس صورت میں، طریقہ اوورلوڈنگ نہیں ہوگی اور متعلقہ طریقہ کو مناسب پیرامیٹرز کے ساتھ بلایا جائے گا۔

نتیجہ

آٹو باکسنگ بنیادی ڈیٹا کی اقسام کو متعلقہ ریپر کلاسز (آبجیکٹ) میں واضح طور پر تبدیل کرنے کا ایک طریقہ کار ہے۔ مرتب کرنے والا قدیم اقسام کو اشیاء میں تبدیل کرنے کا طریقہ استعمال کرتا ہے valueOf()، اور طریقوں IntValue()وغیرہ doubleValue()کو آبجیکٹ کی قدیم قسموں کو حاصل کرنے کے لیے استعمال کرتا ہے۔ آٹو باکسنگ بولین کی قسم booleanکو بولین، byteبائٹ، charکریکٹر، floatفلوٹ، intانٹیجر، longلمبی، shortشارٹ میں تبدیل کرتی ہے۔ پیک کھولنا الٹی سمت میں ہوتا ہے۔ اصل آرٹیکل
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION