JavaRush /وبلاگ جاوا /Random-FA /اتوباکسینگ و جعبه گشایی در جاوا
DSergey_Kh
مرحله

اتوباکسینگ و جعبه گشایی در جاوا

در گروه منتشر شد
در این مقاله به یک ویژگی در جاوا به نام autoboxing/unboxing نگاه خواهیم کرد . اتوباکسینگ و جعبه گشایی تابعی از تبدیل انواع اولیه به انواع شی و بالعکس است. اتوباکسینگ و جعبه گشایی در جاوا - 1کل فرآیند به طور خودکار توسط Java Runtime Environment (JRE) انجام می شود. اما در اجرای این تابع باید مراقب باشید، زیرا ... می تواند بر عملکرد برنامه شما تأثیر بگذارد.

معرفی

در نسخه‌های زیر JDK 1.5، تبدیل انواع داده‌های اولیه مانند int،،، به کلاس‌های wrapper آنها Integer، Character، Float، Double charآسان نبود . با شروع JDK 5، این قابلیت، تبدیل انواع اولیه به اشیاء معادل، به طور خودکار اجرا می شود. این ویژگی به Autoboxing معروف است . فرآیند معکوس، به ترتیب، Unboxing است ، یعنی. فرآیند تبدیل اشیاء به انواع ابتدایی مربوطه. کد نمونه برای اتوباکسینگ و جعبه گشایی در زیر آورده شده است: اتوباکسینگfloatdouble
Integer integer = 9;
جعبه گشایی
int in = 0;
in = new Integer(9);
بسته بندی و باز کردن بسته بندی خودکار چه زمانی استفاده می شود؟ Autoboxing توسط کامپایلر جاوا تحت شرایط زیر استفاده می شود:
  • هنگامی که مقداری از یک نوع اولیه به عنوان پارامتر متد به یک متد ارسال می شود، که انتظار یک شی از کلاس wrapper مربوطه را دارد.
  • وقتی مقداری از نوع اولیه به متغیری از کلاس wrapper مربوطه اختصاص داده می شود.
مثال زیر را در نظر بگیرید: فهرست 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 += را نمی‌توان برای کلاس wrapper اعمال کرد. اما در jdk 1.5 و بالاتر این کد بدون خطا کامپایل می شود و عدد صحیح را به 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;
}
}
جعبه‌گشایی و جعبه‌گشایی خودکار به توسعه‌دهنده اجازه می‌دهد تا کدی بنویسد که خواندن و درک آن آسان باشد. جدول زیر انواع داده های اولیه و اشیاء پوششی مربوط به آنها را نشان می دهد.
انواع اولیه کلاس های پوسته
بولی بولی
بایت بایت
کاراکتر شخصیت
شناور شناور
بین المللی عدد صحیح
طولانی طولانی
کوتاه کوتاه
جدول 1: انواع اولیه و کلاس‌های لفافی معادل با عملگرهای مقایسه، Autoboxing و Unboxing را می‌توان با عملگرهای مقایسه استفاده کرد. قطعه کد زیر نشان می دهد که چگونه این اتفاق می افتد: فهرست 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 ذخیره می شوند، این اشیاء ذخیره شده ممکن است رفتار متفاوتی داشته باشند.
  • کاهش عملکرد جعبه‌گشایی یا جعبه‌گشایی خودکار عملکرد برنامه را کاهش می‌دهد، زیرا یک شی ناخواسته ایجاد می‌کند که جمع‌آورنده زباله را مجبور می‌کند بیشتر کار کند.
معایب AutoBoxing اگرچه AutoBoxing دارای چندین مزیت است، اما دارای معایب زیر است: فهرست 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و عدد صحیح متفاوت بود. در صورت اضافه بار روش، از این دو نوع بدون مشکل استفاده شد. با ظهور بسته بندی / باز کردن خودکار، این کار دشوارتر شده است. یک مثال از این روش overloaded remove()در است ArrayList. کلاس ArrayListدو متد حذف دارد - remove(index)و remove(object). در این صورت اضافه بار متد اتفاق نمی افتد و متد مربوطه با پارامترهای مناسب فراخوانی می شود.

نتیجه

اتوباکسینگ مکانیزمی برای تبدیل ضمنی انواع داده های اولیه به کلاس های بسته بندی (اشیاء) مربوطه است. کامپایلر از روش valueOf()برای تبدیل انواع اولیه به اشیا و از روش ها IntValue()و doubleValue()غیره برای به دست آوردن انواع اولیه شی استفاده می کند. Autoboxing نوع بولی را booleanبه Boolean، byteبه Byte، charبه Character، floatبه Float، intبه Integer، longبه Long shortو Short تبدیل می کند. باز کردن بسته بندی در جهت معکوس اتفاق می افتد. مقاله اصلی
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION