JavaRush /Blogue Java /Random-PT /Retornar uma matriz de comprimento zero, não nula
alexnjc
Nível 31

Retornar uma matriz de comprimento zero, não nula

Publicado no grupo Random-PT
Freqüentemente, existem métodos semelhantes a este:
private List cheesesInStock =;
/**
* @return массив, содержащий все сыры, имеющиеся в магазине,
* or null, если сыров для продажи нет.
*/
public Cheese[] getCheeses() {
if (cheesesInStock.size() == 0)
return null;
}
Não há razão para tratar como caso especial uma situação em que não há queijo à venda. Isso exige que o cliente escreva código adicional para processar o valor de retorno do método пull, por exemplo:
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.");
em vez de simples:
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.");
Esse tipo de detalhamento é necessário para quase todas as chamadas de método que retornam nulo em vez de uma matriz de comprimento zero. Isso está repleto de erros, pois o desenvolvedor do cliente pode não ter escrito um código especial para processar o resultado null. O erro pode passar despercebido durante anos porque esses métodos normalmente retornam um ou mais objetos. Também deve ser mencionado que retornar nullem vez de um array leva à complicação do próprio método que retorna o array. Às vezes, argumenta-se que retornar nulo é preferível a retornar um array de comprimento zero porque evita o custo de alocar o array na memória. Este argumento falha por duas razões. Primeiro, não faz sentido se preocupar com o desempenho neste nível, a menos que o perfil do programa mostre que este método específico é a principal razão para a degradação do desempenho. Segundo, cada chamada a um método que não retorna registros pode passar o mesmo array de comprimento zero para o cliente, porque qualquer array de comprimento zero é imutável e objetos imutáveis ​​podem ser compartilhados. Na verdade, isso é exatamente o que acontece quando você usa o idioma padrão para despejar elementos de uma coleção em um array controlado por tipo:
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АУ);
}
Neste idioma, uma constante, como um array de comprimento zero , é passada para um método toArraypara indicar que tipo ele deve retornar. Normalmente, o método toArrayaloca espaço de memória para o array retornado, mas se a coleção estiver vazia, ele será colocado no array de entrada, e a especificação Сollесtion,tоАггау(Оbjесt[])garante que, se o array de entrada for grande o suficiente para conter a coleção, é isso que será retornado. Portanto, o idioma apresentado nunca alocará um array de comprimento zero na memória, mas usará uma “constante específica do tipo” como tal. Vamos resumir. Não há razão para um método de array retornar nulo em vez de um array de comprimento zero. Este idioma parece derivar da linguagem de programação C, onde o comprimento de um array é retornado separadamente do próprio array. Em C, é inútil alocar memória para um array de comprimento zero. Fonte: Joshua Bloch, Java TM Effective Programming, Lori Publishing House
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION