JavaRush /Blog Java /Random-MS /Kembalikan tatasusunan sifar panjang, bukan nol
alexnjc
Tahap

Kembalikan tatasusunan sifar panjang, bukan nol

Diterbitkan dalam kumpulan
Selalunya terdapat kaedah yang kelihatan seperti ini:
private List cheesesInStock =;
/**
* @return массив, содержащий все сыры, имеющиеся в магазине,
* or null, если сыров для продажи нет.
*/
public Cheese[] getCheeses() {
if (cheesesInStock.size() == 0)
return null;
}
Tiada sebab untuk menganggap sebagai kes istimewa situasi di mana tiada keju dijual. Ini memerlukan pelanggan menulis kod tambahan untuk memproses nilai pulangan kaedah пull, sebagai contoh:
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.");
bukannya mudah:
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.");
Verbositi jenis ini diperlukan untuk hampir setiap panggilan kaedah yang mengembalikan null dan bukannya tatasusunan sifar panjang. Ini penuh dengan ralat, kerana pembangun klien mungkin tidak menulis kod khas untuk memproses hasilnya null. Ralat mungkin tidak dapat dikesan selama bertahun-tahun kerana kaedah sedemikian biasanya mengembalikan satu atau lebih objek. Ia juga harus dinyatakan bahawa mengembalikan nulldan bukannya tatasusunan membawa kepada komplikasi kaedah itu sendiri yang mengembalikan tatasusunan. Kadangkala dikatakan bahawa mengembalikan null adalah lebih baik daripada mengembalikan tatasusunan sifar panjang kerana ia mengelakkan perbelanjaan memperuntukkan tatasusunan dalam ingatan. Hujah ini gagal kerana dua sebab. Pertama, tidak ada gunanya bimbang tentang prestasi pada tahap ini melainkan pemprofilan program menunjukkan bahawa kaedah khusus ini adalah sebab utama kemerosotan prestasi. Kedua, setiap panggilan kepada kaedah yang tidak mengembalikan rekod boleh menghantar tatasusunan sifar panjang yang sama kepada pelanggan, kerana mana-mana tatasusunan sifar panjang tidak boleh berubah dan objek tidak berubah boleh dikongsi. Sebenarnya, inilah yang berlaku apabila anda menggunakan simpulan bahasa standard untuk membuang elemen daripada koleksi ke dalam tatasusunan terkawal jenis:
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АУ);
}
Dalam simpulan bahasa ini, pemalar, sebagai tatasusunan sifar panjang ,toArray dihantar kepada kaedah untuk menunjukkan jenis yang harus dikembalikan. Biasanya, kaedah toArraymemperuntukkan ruang memori untuk tatasusunan yang dikembalikan, tetapi jika koleksi itu kosong, ia diletakkan dalam tatasusunan input, dan spesifikasi Сollесtion,tоАггау(Оbjесt[])memastikan bahawa jika tatasusunan input cukup besar untuk mengandungi koleksi, itulah yang dikembalikan. Oleh itu, simpulan bahasa yang dibentangkan tidak akan memperuntukkan tatasusunan sifar panjang ke dalam ingatan, tetapi menggunakan "pemalar khusus jenis" seperti itu. Mari kita ringkaskan. Tiada sebab untuk kaedah tatasusunan mengembalikan nol dan bukannya tatasusunan panjang sifar. Idiom ini nampaknya berpunca daripada bahasa pengaturcaraan C, di mana panjang tatasusunan dikembalikan secara berasingan daripada tatasusunan itu sendiri. Dalam C, tidak berguna untuk memperuntukkan memori untuk tatasusunan sifar panjang. Sumber: Joshua Bloch, Java TM Effective Programming, Lori Publishing House
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION