JavaRush /จาวาบล็อก /Random-TH /ส่งกลับอาร์เรย์ที่มีความยาวเป็นศูนย์ ไม่ใช่ค่าว่าง
alexnjc
ระดับ

ส่งกลับอาร์เรย์ที่มีความยาวเป็นศูนย์ ไม่ใช่ค่าว่าง

เผยแพร่ในกลุ่ม
มักจะมีวิธีการที่มีลักษณะดังนี้:
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, Lori Publishing House
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION