Autoboxing و Unboxing در جاوا

Autoboxing و Unboxing در جاوا چیست؟ توضیح + مثال

در زبان برنامه نویسی جاوا، مفاهیمی وجود دارد که گاهی میتوانند پیچیده باشند ولی در عین حال کار را برای شما ساده تر کنند. دوتا از این مفاهیم Autoboxing و Unboxing در جاوا است که در این مقاله از برنامه چی میخواهیم آن را کاملا بررسی کنیم. با ما همراه باشید. (منبع نوشته: GeeksforGeeks)

در این مقاله سرفصل های زیر بررسی میشوند:
Autoboxing چیست؟
Unboxing چیست؟
مزایای Autoboxing و Unboxing
سوالات خودتان را بپرسید


Autoboxing چیست؟

autoboxing چیست

Autoboxing: به تبدیل کردن یک نوع داده اولیه (Primitive) به یک آبجکت از Wrapper Class که همان نوع داده اولیه را در خودش نگه داری میکند، Autoboxing در جاوا گفته میشود. به عنوان مثال نوع داده int (که دیگه باید باهاش آشنا باشین، و اگر نیستین توی دوره آموزش جاوا حتما درباره ش بخونین)، به یک کلاس Integer تبدیل میشود. وقتی که یک نوع داده اولیه این شرایط را داشته باشد، کامپایلر جاوا بصورت اتوماتیک Autoboxing را انجام میدهد:

  • وقتی که داده اولیه (primitive) به متدی پاس داده بشود که یک آبجکت را قبول میکند، این داده بصورت اتوماتیک به یک آبجکت Wrapper class از همان نوع داده تبدیل میشود.
  • اگر داده اولیه (primitive) درون یک Wrapper class از همان نوع داده ریخته بشود، باز هم Autoboxing انجام خواهد شد.

Unboxing چیست؟

unboxing در جاوا

Unboxing: تبدیل کردن یک آبجکت از نوع کلاس Wrapper به نوع داده اولیه ای که متناظر آن است. یعنی به زبان ساده تر، دقیقا برعکس Autoboxing در جاوا است. در پاراگراف قبلی گفتیم یک نوع داده Primitive را به یک کلاس Wrapper تبدیل میکند. Unboxing برعکس این کار را انجام میدهد، یک آبجکت از کلاس بسته بندی کننده (یا همون کلاس Wrapper که بالاتر درباره ش توضیح دادیم) رو به یک داده اولیه تبدیل میکنه که از همان جنس باشد. به عنوان مثال تبدیل کلاس Integer به داده int همین کار است. کامپایلر جاوا بصورت اتوماتیک Unboxing را زمانی که این شرایط برای یک آبجکت کلاس Wrapper برقرار باشد، انجام میدهد:

  • اگر این کلاس به یک متد پاس داده بشود که یک مقدار از نوع داده اولیه متناظر را از ما انتظار داشته باشد.
  • اگر آن را درون یک متغیر از همان نوع داده آبجکت بریزیم، باز هم این کار انجام میشود.

در ادامه یک جدول را آماده کرده ایم که در آن داده های اولیه و آبجکت های کلاس Wrapper که دقیقا از یک نوع هستند را کنار هم نشان دادیم. این جدول همان چیزی است که توسط کامپایلر جاوا مورد استفاده قرار میگیرد.

Wrapper ClassPrimitive Type
Booleanboolean
Bytebyte
Characterchar
Floatfloat
Integerint
Longlong
Shortshort
Doubledouble

دقت کنید توی کل این مقاله هر جا میگیم یک داده از نوع int، منظورمون داده های اولیه (primitive) هست و اگر میگیم مثلا آبجکت Integer منظورمون همون آبجکت از کلاس Wrapper هست که از نوع Integer هست و با داده های اولیه تفاوت داره. توی خود سایتمون راجب بهش توضیح دادیم که میتونین از اینجا بخونین.


مثال

یک مثال را برای نشان دادن مفهوم Autoboxing و Unboxing در جاوا با یکدیگر بررسی میکنیم.

// Java program to illustrate the concept
// of Autoboxing and Unboxing
import java.io.*; 

class GFG
{
	public static void main (String[] args)
	{
		// creating an Integer Object
		// with value 10.
		Integer i = new Integer(10); 

		// unboxing the Object
		int i1 = i; 

		System.out.println("Value of i: " + i);
		System.out.println("Value of i1: " + i1); 

		//Autoboxing of char
		Character gfg = 'a'; 

		// Auto-unboxing of Character
		char ch = gfg;
		System.out.println("Value of ch: " + ch);
		System.out.println("Value of gfg: " + gfg); 

	}
}

این کدها خروجی زیر را تولید میکنند.


خروجی

Value of i: 10
Value of i1: 10
Value of ch: a
Value of gfg: a

حال یک مثال دیگر را برای فهمیدن اینکه کامپایلر چگونه Autoboxing و Unboxing را انجام میدهد. در این مثال با استفاده از Collection ها و مفهوم Generic این مورد را توضیح میدهیم.

/* Java program to illustrate autoboxing */
import java.io.*;
import java.util.*; 

class GFG
{
	public static void main (String[] args)
	{
		/* Here we are creating a list
		of elements of Integer type.
		adding the int primitives type values */
		List<Integer> list = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++)
			list.add(i);
	}
}

در مثال بالا ما یک لیست از المان هایی که از نوع Integer بودند را درست کردیم. ما مقادیری از نوع داده ای int را به جای آبجکت های Integer وارد میکنیم و باز هم کد با موفقیت کامپایل میشود. یعنی یک ارور زمان کامپایل (Compile Time Error) تولید نمیشود وقتی که کامپایلر از روی داده اولیه int، یک آبجکت Integer را از کلاس Wrapper تولید میکند و آن را به لیست هم اضافه میکند هیچ اروری تولید نمیشود.

در مثال بعدی میبینید که این تبدیل نوع چگونه اتفاق می افتد.

/* Java program to illustrate autoboxing */
import java.io.*;
import java.util.*; 

class GFG
{
	public static void main (String[] args)
	{
		/* Here we are creating a list of elements
		of Integer type. Adding the int primitives
		type values by converting them into Integer
		wrapper Object*/
		List<Integer> list = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++)
			list.add(Integer.valueOf(i)); 

	}
}

یک مثال دیگر از Autoboxing و Unboxing این است که مجموع چند عدد فرد را در یک لیست پیدا کنیم. نکته مهم در این برنامه این است که عملگرهای “باقی مانده” (%) و “جمع یکانی” (=+) روی آبجکت های Integer اعمال نمیشوند. اما باز هم این کد با موفقیت کامپایل میشود زیرا عمل Unboxing برای آبجکت Integer که آنرا به داده اولیه int تبدیل میکند، با صدا زدن متد ()intValue بصورت ران تایم اعمال میشود.

// Java program to illustrate find sum
// of odd numbers using autobxing and unboxing
import java.io.*;
import java.util.*; 

class GFG
{
	public static int sumOfOddNumber(List<Integer> list)
	{
		int sum = 0;
		for (Integer i : list)
		{
			// unboxing of i automatically
			if(i % 2 != 0)
				sum += i;
			/* unboxing of i is done automatically
			using intvalue implicitly
			if(i.intValue() % 2 != 0)
				sum += i.intValue();*/
		}
		return sum;
	} 

	public static void main (String[] args)
	{
		/* Here we are creating a list of elements
		of Integer type and adding the int primitives
		type values to the list*/
		List<Integer> list = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++)
			list.add(i); 

		// getting sum of all odd no. in the list.
		int sumOdd = sumOfOddNumber(list);
		System.out.println("Sum of odd numbers = " + sumOdd);
	}
} 

خروجی

Sum of odd numbers = 25

مزایای Autoboxing و Unboxing

  • Autoboxing و Unboxing به توسعه دهندگان اجازه میدهند که کدهای تمیزتری بنویسند که برای خواندن هم ساده تر میباشد.
  • این تکنیک به ما اجازه میدهد از داده های اولیه و آبجکت های کلاس Wrapper هرطوری که خواستیم استفاده کنیم و لازم نباشد بصورت صریح این تبدیل را انجام بدهیم.

سوالات خودتان را بپرسید

در این مقاله درباره دوتا از مفاهیم در برنامه نویسی جاوا، به نام Autoboxing و Unboxing صحبت کردیم. اگر سوالی در زهن شما باقی مانده است یا قسمتی نیاز به توضیحات بیشتر دارد، میتوانید آن را در قسمت نظرات بپرسید تا به سرعت به آنها پاسخ بدهیم.

همچنین اگر درباره این مفاهیم اطلاعاتی دارید، لطفا با نوشتن آن در قسمت نظرات ما را در کامل تر کردن این مقاله آموزشی یاری کنید.

درباره نویسنده

6 در مورد “Autoboxing و Unboxing در جاوا چیست؟ توضیح + مثال”

  1. امیر برهان

    سلام یه سوالی که داشتم اینه autoboxing در پروژه چه کاربردی داره ؟ یعنی من چه موقع بهتره یا باید از این متد استفاده کنم ؟

    1. اصولا برای کار خاصی نمیشه ازش استفاده کرد و اگر دقت کرده باشید اخر مقاله نوشته شده ک
      “Autoboxing و Unboxing به توسعه دهندگان اجازه میدهند که کدهای تمیزتری بنویسند که برای خواندن هم ساده تر میباشد.”
      و این کار ها بیشتر کار برنامه نویش رو در کد زدن اسان میکند.

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

اسکرول به بالا