اغلب روش هایی وجود دارد که شبیه به این هستند:
private List cheesesInStock = … ;
/**
* @return массив, содержащий все сыры, имеющиеся в магазине,
* or null, если сыров для продажи нет.
*/
public Cheese[] getCheeses() {
if (cheesesInStock.size() == 0)
return null;
}
هیچ دلیلی وجود ندارد که به عنوان یک مورد خاص با وضعیتی برخورد کنیم که در آن پنیر در فروش وجود ندارد. این نیاز به مشتری برای نوشتن کد اضافی برای پردازش مقدار برگشتی متد دارد пull
، به عنوان مثال:
Cheese[] cheeses = shop.getCheeses();
if (cheeses ! = пull &&
Аrrауs.аsList(shор.gеtСhееsеs()).соntаins(Сhееsе.SТILТON))
Sуstеm.оut.рrintln("Jоllу good, just the thing.");
به جای ساده:
if (Аrrаys.аsList(shор.gеtСhееsеs()).соntаins(Сhееsе.SТILTON)) Sуstеm.оut.рrintln("Jоllу good, just the thing.");
این نوع پرگویی تقریباً برای هر فراخوانی متدی که به جای آرایهای با طول صفر، null را برمیگرداند، ضروری است. این مملو از خطا است، زیرا توسعهدهنده مشتری ممکن است کد خاصی برای پردازش نتیجه ننوشته باشد null
. این خطا ممکن است برای سالها شناسایی نشود زیرا چنین روشهایی معمولاً یک یا چند شی را برمیگردانند. همچنین لازم به ذکر است که بازگشت null
به جای آرایه منجر به پیچیدگی خود روشی می شود که آرایه را برمی گرداند. گاهی اوقات استدلال می شود که برگرداندن null به برگرداندن یک آرایه با طول صفر ارجحیت دارد زیرا از هزینه تخصیص آرایه در حافظه جلوگیری می کند. این استدلال به دو دلیل شکست می خورد. اولاً، نگرانی در مورد عملکرد در این سطح وجود ندارد، مگر اینکه پروفایل برنامه نشان دهد که این روش خاص دلیل اصلی کاهش عملکرد است. دوم، هر فراخوانی به متدی که رکوردها را بر نمیگرداند، میتواند همان آرایه با طول صفر را به مشتری ارسال کند، زیرا هر آرایهای با طول صفر تغییرناپذیر است و اشیاء تغییرناپذیر را میتوان به اشتراک گذاشت. در واقع، این دقیقاً همان چیزی است که وقتی از اصطلاح استاندارد برای ریختن عناصر از یک مجموعه به یک آرایه کنترلشده تایپ استفاده میکنید، اتفاق میافتد:
private List сhееsеsInStосk = … ,
private fiпаl static Cheese[] NULL_CHEESE_ARRAY = nеw Cheese[0];
/**
* @геtuгп массие, содержащий все сыры, имеющиеся в магазине
*/
public Cheese[] getCheeses() {
геtuгп (Cheese[] сhееsеsInStосk.tоАггау(NULL_СНЕЕSЕ_АRRАУ);
}
در این اصطلاح، یک ثابت، به عنوان یک آرایه با طول صفر ، به یک متد ارسال می شود toArray
تا نشان دهد که چه نوع باید برگردد. به طور معمول، متد toArray
فضای حافظه را برای آرایه برگشتی اختصاص می دهد، اما اگر مجموعه خالی باشد، در آرایه ورودی قرار می گیرد و مشخصات Сollесtion,tоАггау(Оbjесt[])
تضمین می کند که اگر آرایه ورودی به اندازه کافی بزرگ باشد که مجموعه را در خود جای دهد، همان چیزی است که برگردانده می شود. بنابراین، اصطلاح ارائه شده به خودی خود هرگز یک آرایه با طول صفر را به حافظه اختصاص نمی دهد، بلکه از یک "ثابت نوع خاص" استفاده می کند. بیایید خلاصه کنیم. دلیلی وجود ندارد که یک روش آرایه به جای یک آرایه با طول صفر، null را برگرداند. به نظر می رسد این اصطلاح از زبان برنامه نویسی C سرچشمه می گیرد، جایی که طول یک آرایه جدا از خود آرایه برگردانده می شود. در C، تخصیص حافظه برای یک آرایه با طول صفر بی فایده است. منبع: Joshua Bloch، Java TM Effective Programming، انتشارات لری
GO TO FULL VERSION