JavaRush /Blog Java /Random-PL /Zwróć tablicę o zerowej długości, a nie null
alexnjc
Poziom 31

Zwróć tablicę o zerowej długości, a nie null

Opublikowano w grupie Random-PL
Często istnieją metody wyglądające tak:
private List cheesesInStock =;
/**
* @return массив, содержащий все сыры, имеющиеся в магазине,
* Lub null, если сыров для продажи нет.
*/
public Cheese[] getCheeses() {
if (cheesesInStock.size() == 0)
return null;
}
Nie ma powodu traktować jako szczególnego przypadku sytuacji, w której nie ma sera w sprzedaży. Wymaga to od klienta napisania dodatkowego kodu w celu przetworzenia wartości zwracanej przez metodę пull, na przykład:
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.");
zamiast prostego:
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.");
Ten rodzaj szczegółowości jest niezbędny w przypadku prawie każdego wywołania metody, które zwraca wartość null zamiast tablicy o zerowej długości. Jest to obarczone błędami, ponieważ programista klienta mógł nie napisać specjalnego kodu do przetworzenia wyniku null. Błąd może pozostać niewykryty przez lata, ponieważ takie metody zazwyczaj zwracają jeden lub więcej obiektów. Należy również wspomnieć, że zwrócenie nullzamiast tablicy prowadzi do komplikacji samej metody zwracającej tablicę. Czasami twierdzi się, że zwrócenie wartości null jest lepsze niż zwrócenie tablicy o zerowej długości, ponieważ pozwala uniknąć kosztów związanych z alokacją tablicy w pamięci. Argument ten jest nietrafiony z dwóch powodów. Po pierwsze, nie ma sensu martwić się wydajnością na tym poziomie, chyba że profilowanie programu wykaże, że ta konkretna metoda jest główną przyczyną pogorszenia wydajności. Po drugie, każde wywołanie metody, która nie zwraca rekordów, może przekazać klientowi tę samą tablicę o zerowej długości, ponieważ każda tablica o zerowej długości jest niezmienna, a niezmienne obiekty można współużytkować. W rzeczywistości dokładnie tak się dzieje, gdy używasz standardowego idiomu do zrzucania elementów z kolekcji do tablicy kontrolowanej typem:
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АУ);
}
W tym idiomie stała w postaci tablicy o zerowej długości jest przekazywana do metody toArrayw celu wskazania, jaki typ powinna zwrócić. Zazwyczaj metoda toArrayprzydziela przestrzeń pamięci dla zwróconej tablicy, ale jeśli kolekcja jest pusta, jest umieszczana w tablicy wejściowej, a specyfikacja Сollесtion,tоАггау(Оbjесt[])zapewnia, że ​​jeśli tablica wejściowa jest wystarczająco duża, aby pomieścić kolekcję, to właśnie to zostanie zwrócone. Dlatego też przedstawiony idiom nigdy sam w sobie nie przydzieli tablicy o zerowej długości do pamięci, lecz użyje „stałej specyficznej dla typu” jako takiej. Podsumujmy. Nie ma powodu, aby metoda tablicowa zwracała wartość null zamiast tablicy o zerowej długości. Ten idiom wydaje się wywodzić z języka programowania C, w którym długość tablicy jest zwracana oddzielnie od samej tablicy. W C nie ma sensu alokować pamięci dla tablicy o zerowej długości. Źródło: Joshua Bloch, Efektywne programowanie Java TM, Wydawnictwo Lori
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION