JavaRush /Java blogi /Random-UZ /Null emas, nol uzunlikdagi massivni qaytaring
alexnjc
Daraja

Null emas, nol uzunlikdagi massivni qaytaring

Guruhda nashr etilgan
Ko'pincha shunga o'xshash usullar mavjud:
private List cheesesInStock =;
/**
* @return массив, содержащий все сыры, имеющиеся в магазине,
* or null, если сыров для продажи нет.
*/
public Cheese[] getCheeses() {
if (cheesesInStock.size() == 0)
return null;
}
Sotuvda pishloq mavjud bo'lmagan vaziyatni alohida holat sifatida ko'rib chiqish uchun hech qanday sabab yo'q. Bu mijozdan usulning qaytish qiymatini qayta ishlash uchun qo'shimcha kod yozishni talab qiladi пull, masalan:
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.");
oddiy o'rniga:
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.");
Nol uzunlikdagi massiv o'rniga null qiymatini qaytaradigan deyarli har bir usul chaqiruvi uchun bunday aniqlik zarur. Bu xatolar bilan to'la, chunki mijoz ishlab chiqaruvchisi natijani qayta ishlash uchun maxsus kod yozmagan bo'lishi mumkin null. Xato yillar davomida aniqlanmasligi mumkin, chunki bunday usullar odatda bir yoki bir nechta ob'ektni qaytaradi. Shuni ham ta'kidlash kerakki, nullmassiv o'rniga qaytish massivni qaytaradigan usulning o'zini murakkablashtirishga olib keladi. Ba'zida nol uzunlikdagi massivni qaytarishdan ko'ra null qiymatini qaytarish afzalroq, deb ta'kidlanadi, chunki u massivni xotiraga joylashtirish xarajatlaridan qochadi. Ushbu dalil ikki sababga ko'ra muvaffaqiyatsizlikka uchraydi. Birinchidan, dasturni profillash ushbu aniq usul ishlashning pasayishining asosiy sababi ekanligini ko'rsatmasa, ushbu darajadagi ishlash haqida tashvishlanishning ma'nosi yo'q. Ikkinchidan, yozuvlarni qaytarmaydigan usulga har bir qo'ng'iroq mijozga bir xil uzunlikdagi massivni o'tkazishi mumkin, chunki har qanday nol uzunlikdagi massiv o'zgarmasdir va o'zgarmas ob'ektlar umumiy bo'lishi mumkin. To'plamdagi elementlarni tip bilan boshqariladigan massivga tashlash uchun standart idiomadan foydalanganda aynan shunday bo'ladi:
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АУ);
}
Bu idiomada doimiy nol uzunlikdagi massivtoArray sifatida qaysi turga qaytishi kerakligini ko'rsatish uchun usulga uzatiladi. Odatda, usul toArrayqaytarilgan massiv uchun xotira maydonini ajratadi, lekin agar to'plam bo'sh bo'lsa, u kirish massiviga joylashtiriladi va spetsifikatsiya Сollесtion,tоАггау(Оbjесt[])agar kirish massivi to'plamni o'z ichiga olishi uchun etarlicha katta bo'lsa, aynan shu narsa qaytarilishini ta'minlaydi. Shuning uchun, taqdim etilgan idiomaning o'zi hech qachon nol uzunlikdagi massivni xotiraga ajratmaydi, balki "turga xos doimiy" dan foydalanadi. Keling, xulosa qilaylik. Massiv usuli uchun nol uzunlikdagi massivni emas, balki null qiymatini qaytarish uchun hech qanday sabab yo'q. Bu idioma massiv uzunligi massivning o'zidan alohida qaytariladigan C dasturlash tilidan kelib chiqqanga o'xshaydi. C da nol uzunlikdagi massiv uchun xotira ajratish foydasiz. Manba: Joshua Bloch, Java TM Effective Programming, Lori nashriyot uyi
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION