JavaRush /Java Blog /Random-IT /Restituisce un array di lunghezza zero, non null
alexnjc
Livello 31

Restituisce un array di lunghezza zero, non null

Pubblicato nel gruppo Random-IT
Spesso ci sono metodi simili a questi:
private List cheesesInStock =;
/**
* @return массив, содержащий все сыры, имеющиеся в магазине,
* or null, если сыров для продажи нет.
*/
public Cheese[] getCheeses() {
if (cheesesInStock.size() == 0)
return null;
}
Non c'è motivo di considerare come un caso speciale la situazione in cui non c'è formaggio in vendita. Ciò richiede che il client scriva codice aggiuntivo per elaborare il valore restituito del metodo пull, ad esempio:
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.");
invece che semplice:
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.");
Questo tipo di dettaglio è necessario per quasi ogni chiamata di metodo che restituisce null invece di un array di lunghezza zero. Questo è pieno di errori, poiché lo sviluppatore del client potrebbe non aver scritto un codice speciale per elaborare il risultato null. L'errore potrebbe non essere rilevato per anni poiché tali metodi in genere restituiscono uno o più oggetti. Va anche detto che la restituzione nullinvece di un array comporta una complicazione del metodo stesso che restituisce l'array. A volte si sostiene che restituire null sia preferibile rispetto a restituire un array di lunghezza zero perché evita il costo dell'allocazione dell'array in memoria. Questo argomento fallisce per due ragioni. Innanzitutto, non ha senso preoccuparsi delle prestazioni a questo livello a meno che la profilazione del programma non mostri che questo particolare metodo è il motivo principale del degrado delle prestazioni. In secondo luogo, ogni chiamata a un metodo che non restituisce record può passare lo stesso array di lunghezza zero al client, poiché qualsiasi array di lunghezza zero è immutabile e gli oggetti immutabili possono essere condivisi. In effetti, questo è esattamente ciò che accade quando si utilizza l'idioma standard per scaricare elementi da una raccolta in un array controllato dal 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АУ);
}
In questo linguaggio, una costante, come un array di lunghezza zero , viene passata a un metodo toArrayper indicare quale tipo dovrebbe restituire. In genere, il metodo toArrayalloca spazio di memoria per l'array restituito, ma se la raccolta è vuota, viene inserita nell'array di input e la specifica Сollесtion,tоАггау(Оbjесt[])garantisce che se l'array di input è sufficientemente grande da contenere la raccolta, questo sarà ciò che verrà restituito. Pertanto, l'idioma presentato non allocherà mai un array di lunghezza zero in memoria, ma utilizzerà una "costante specifica del tipo" in quanto tale. Riassumiamo. Non vi è alcun motivo per cui un metodo di array restituisca null anziché un array di lunghezza zero. Questo idioma sembra derivare dal linguaggio di programmazione C, dove la lunghezza di un array viene restituita separatamente dall'array stesso. In C è inutile allocare memoria per un array di lunghezza zero. Fonte: Joshua Bloch, Java TM Effective Programming, Lori Publishing House
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION