آموزش جامع برنامه نویسی جاوا به زبان ساده — بخش دوازدهم: بستهبندی و لیستها
در بخش دوازدهم آموزش برنامهنویسی جاوا در مورد بستهبندی (Boxing) و بستهگشایی (Unboxing) انواع مختلف صحبت خواهیم کرد و سپس به بحث لیستها میرسیم.
بخش یازدهم آموزش جامع برنامهنویسی جاوا: کلکسیونها
بخش دهم آموزش جامع برنامهنویسی جاوا: حلقهها
بخش نهم آموزش جامع برنامهنویسی جاوا: عملگرها
هر نوع ابتدایی در زبان جاوا یک کلاس همتا در JDK دارد که در جدول 4 مشاهده میشود.
جدول 4- انواع ابتدایی و همتایان آنها در JDK
نوع ابتدایی | همتای JDK |
boolean | java.lang.Boolean |
byte | java.lang.Byte |
char | java.lang.Character |
short | java.lang.Short |
int | java.lang.Integer |
long | java.lang.Long |
float | java.lang.Float |
double | java.lang.Double |
هر کلاس JDK متدهایی برای تجزیه و تبدیل بازنمایی درونی آنها به یک نوع ابتدایی ارائه میکند. برای نمونه، این کد مقدار اعشاری 238 را به عدد صحیح تبدیل میکند:
int value = 238;
Integer boxedValue = Integer.valueOf(value);
این تکنیک به نام بستهبندی Boxing شناخته میشود زیرا نوع ابتدایی را داخل یک پوشش یا جعبه قرار میدهیم. بهطور مشابه برای تبدیل نمایش Integer به همتای int آن، میتوان آن را بستهگشایی Unbox کرد:
Integer boxedValue = Integer.valueOf(238);
int intValue = boxedValue.intValue();
بستهبندی و بستهگشایی خودکار
معمولاً نیازی به بستهبندی یا بستهگشایی انواع ابتدایی بهصورت صریح وجود ندارد. در عوض میتوان از بستهبندی و بستهگشایی خودکار زبان جاوا استفاده کرد:
int intValue = 238;
Integer boxedValue = intValue;
//
intValue = boxedValue;
در هر حال معمولاً توصیه میشود که از بستهبندی خودکار اجتناب شود زیرا ممکن است منجر به مشکلاتی در خوانایی کد بشود. کد در قطعههای بستهبندی و بستهگشایی بدیهیتر است و ازاینرو خواناتر است. تحمل این زحمت کدنویسی ارزشش را دارد.
تحلیل و تبدیل انواع بستهبندی شده
دیدیم که چگونه میتوان یک نوع بستهبندی شده داشت. اما در مورد تحلیل یک رشته عددی که گمان میرود نوع بستهبندی شدهای در خود دارد چه میشود کرد؟ کلاسهای پوششی JDK متدهایی برای انجام این کار نیز دارند:
String characterNumeric = "238";
Integer convertedValue = Integer.parseInt(characterNumeric);
همچنین میتوان محتوای پوششی JDK را به یک رشته تبدیل کرد:
Integer boxedValue = Integer.valueOf(238);
String characterNumeric = boxedValue.toString();
توجه کنید که از عملکرد الحاق در عبارت String استفاده کردیم و نوع ابتدایی بستهگشایی شد و بستهبندی کننده JDK بهطور خودکار فراخوانی ()toString را بر روی آنها اعمال کرد.
لیستها
لیست یک مجموعه مرتب است که به نام توالی sequence نیز شناخته میشود. از آنجا که لیست مرتب است کنترل کاملی بر روی آیتمهایی که وارد آن میشوند وجود دارد. یک مجموعه List جاوا میتواند تنها اشیا (و نه انواع ابتدایی مانند int) را در خود ذخیره کند و نحوه عملکرد آن بهطور صریح مشخص شده است.
لیست یک اینترفیس است بنابراین میتوان بهطور مستقیم وهلهای از آن ایجاد کرد. در اینجا با متداولترین پیادهسازی لیست که ArrayList است کار میکنیم. لیست را به دو روش میتوان اعلان کرد. روش نخست از دستورزبان صریح استفاده میکند:
List<String> listOfStrings = new ArrayList<String>();
روش دوم از عملگر «diamond» که در JDK 7 معرفی شده است، استفاده میکند:
List<String> listOfStrings = new ArrayList<>();
توجه کنید که نوع شیء در ایجاد وهله از لیست ArrayList بیان نشده است. به این دلیل که نوع کلاس در سمت راست عبارت باید با سمت چپ برابر باشد. در ادامه این آموزش از هر دو روش استفاده خواهیم کرد تا نحوه استفاده ازاین دو روش را در عمل متوجه شوید.
توجه داشته باشید که شیء ArrayList را به یک متغیر از نوع List انتساب کردهایم. در برنامهنویسی جاوا میتوان یک متغیر از یک نوع را به نوع دیگر منتسب کرد به شرط اینکه متغیری که منتسب میشود یک سوپرکلاس یا اینترفیس پیادهسازی شده از سوی متغیر انتساب یافته باشد. در بخش بعدی بهطور دقیقتر در مورد قواعد حاکم بر این انتساب متغیرها صحبت خواهیم کرد.
نوع رسمی
<Object> در قطعه کد قبلی به نام «نوع رسمی» نامیده میشود. <Object> برای کامپایلر مشخص میکند که لیست حاوی مجموعهای از این نوع اشیا است که بدین معنی است که میتوان هر چه که لازم است را در لیست قرار داد.
اگر بخواهیم محدودیتهایی در مورد آنچه میتوان در لیست قرار داد تعیین کنیم باید نوع رسمی متفاوتی تعیین کنیم:
List<Person> listOfPersons = new ArrayList<Person>();
اینک لیست تنها وهلههایی از Person را در خود نگه میدارد.
استفاده از لیست
بهطور کلی استفاده از لیست مانند استفاده از مجموعههای جاوا بسیار آسان است. در ادامه برخی از کارهایی که با لیست میتوان انجام داد را نشان دادهایم:
- قرار دادن چیزی در لیست
- پرسیدن از لیست در مورد اندازه آن
- خارج کردن چیزی از لیست
برای قرار دادن چیزی در لیست متد ()add فراخوانده میشود:
List<Integer> listOfIntegers = new ArrayList<>();
listOfIntegers.add(Integer.valueOf(238));
متد ()add عنصری را به انتهای لیست اضافه میکند. برای اینکه بدانیم اندازه لیست چه مقدار است متد ()size را فراخوانی میکنیم:
List<Integer> listOfIntegers = new ArrayList<>();
listOfIntegers.add(Integer.valueOf(238));
Logger l = Logger.getLogger("Test");
l.info("Current List size: " + listOfIntegers.size());
برای دریافت یک آیتم از لیست از متد ()get استفاده میکنیم و اندیس آیتمی که میخواهیم را به آن میفرستیم:
List<Integer> listOfIntegers = new ArrayList<>();
listOfIntegers.add(Integer.valueOf(238));
Logger l = Logger.getLogger("Test");
l.info("Item at index 0 is: " listOfIntegers.get(0));
در یک برنامه واقعی، لیست میتواند شامل رکوردها یا اشیای تجاری باشد و احتمالاً میخواهیم در بخشی از پردازش به آنها نگاهی بیندازیم. این کار چگونه ممکن است؟ پاسخ این است که باید حلقهای برای بررسی عناصر مجموعه نوشت و این کار به لطف پیادهسازی اینترفیس java.lang.Iterable از سوی لیست ممکن است.
Iterable
اگر مجموعهای java.lang.Iterable را پیادهسازی کرده باشد یک مجموعه iterable نامیده میشود. میتوان از یک سمت لیست شروع کرد و یکبهیک تا انتهای لیست آیتمها را بررسی کرد.
در بخش حلقه بهطور اختصار به دستورزبان خاص برای تکرار روی مجموعهها که از طریق اینترفیس iterable قابل انجام است اشاره کردیم. در اینجا جزییات بیشتری از آن ارائه میکنیم:
for (objectType varName: collectionReference) {
// Start using objectType (via varName) right away...
}
این کد مجرد است؛ نمونهای واقعی از آن در ادامه ارائه شده است:
List<Integer> listOfIntegers = obtainSomehow();
Logger l = Logger.getLogger("Test");
for (Integer i: listOfIntegers) {
l.info("Integer value is: " + i);
}
این کد کوچک همان کار کد طولانی بالا را انجام میدهد:
List<Integer> listOfIntegers = obtainSomehow();
Logger l = Logger.getLogger("Test");
for (int aa = 0; aa < listOfIntegers.size(); aa++) {
Integer I = listOfIntegers.get(aa);
l.info("Integer value is: " + i);
}
کد اول از دستور زبان اختصاری استفاده کرده است. متغیر Index وجود ندارد (در این مثال aa) و متد ()get لیست فراخوانی نمیشود.
از آنجا که List نسخه بسط یافتهی java.util.Collection است که Iterable را پیادهسازی کرده است میتوان از دستورزبان اختصاری برای تکرار روی آیتمهای لیست استفاده کرد.
در بخش سیزدهم این سلسله آموزشها با مفهوم مجموعهها در جاوا آشنا میشویم.