JavaRush /Blog Java /Random-VI /Trả về một mảng có độ dài bằng 0, không phải null
alexnjc
Mức độ

Trả về một mảng có độ dài bằng 0, không phải null

Xuất bản trong nhóm
Thường có những phương pháp trông như thế này:
private List cheesesInStock =;
/**
* @return массив, содержащий все сыры, имеющиеся в магазине,
* or null, если сыров для продажи нет.
*/
public Cheese[] getCheeses() {
if (cheesesInStock.size() == 0)
return null;
}
Không có lý do gì để coi đó là một trường hợp đặc biệt khi không có pho mát để bán. Điều này yêu cầu client viết thêm code để xử lý giá trị trả về của phương thức пull, ví dụ:
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.");
thay vì đơn giản:
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.");
Kiểu chi tiết này là cần thiết cho hầu hết mọi lệnh gọi phương thức trả về null thay vì mảng có độ dài bằng 0. Điều này có nhiều lỗi vì nhà phát triển ứng dụng khách có thể chưa viết mã đặc biệt để xử lý kết quả null. Lỗi có thể không bị phát hiện trong nhiều năm vì các phương pháp như vậy thường trả về một hoặc nhiều đối tượng. Cũng cần đề cập rằng việc trả về nullthay vì một mảng sẽ dẫn đến sự phức tạp của chính phương thức trả về mảng đó. Đôi khi người ta lập luận rằng trả về null tốt hơn là trả về một mảng có độ dài bằng 0 vì nó tránh được chi phí phân bổ mảng trong bộ nhớ. Lập luận này thất bại vì hai lý do. Đầu tiên, không có ích gì khi lo lắng về hiệu suất ở mức này trừ khi việc lập hồ sơ chương trình cho thấy rằng phương pháp cụ thể này là nguyên nhân chính dẫn đến suy giảm hiệu suất. Thứ hai, mỗi lệnh gọi đến một phương thức không trả về bản ghi có thể chuyển cùng một mảng có độ dài bằng 0 cho máy khách, bởi vì mọi mảng có độ dài bằng 0 đều không thể thay đổi và các đối tượng bất biến có thể được chia sẻ. Trên thực tế, đây chính xác là những gì xảy ra khi bạn sử dụng thành ngữ tiêu chuẩn để kết xuất các phần tử từ một bộ sưu tập vào một mảng được kiểm soát kiểu:
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АУ);
}
Trong thành ngữ này, một hằng số, dưới dạng một mảng có độ dài bằng 0 , được truyền cho một phương thức toArrayđể cho biết nó sẽ trả về loại nào. Thông thường, phương thức này toArrayphân bổ không gian bộ nhớ cho mảng được trả về, nhưng nếu tập hợp trống thì nó sẽ được đặt vào mảng đầu vào và đặc tả Сollесtion,tоАггау(Оbjесt[])đảm bảo rằng nếu mảng đầu vào đủ lớn để chứa tập hợp thì đó là nội dung được trả về. Do đó, thành ngữ được trình bày sẽ không bao giờ tự phân bổ một mảng có độ dài bằng 0 vào bộ nhớ mà sử dụng một “hằng số dành riêng cho loại” như vậy. Hãy tóm tắt. Không có lý do gì để một phương thức mảng trả về null thay vì một mảng có độ dài bằng 0. Thành ngữ này dường như xuất phát từ ngôn ngữ lập trình C, trong đó độ dài của một mảng được trả về tách biệt với chính mảng đó. Trong C, việc phân bổ bộ nhớ cho một mảng có độ dài bằng 0 là vô ích. Nguồn: Joshua Bloch, Lập trình hiệu quả Java TM, Nhà xuất bản Lori
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION