JavaRush /Blog Java /Random-ES /Devuelve una matriz de longitud cero, no nula
alexnjc
Nivel 31

Devuelve una matriz de longitud cero, no nula

Publicado en el grupo Random-ES
A menudo existen métodos que se parecen a este:
private List cheesesInStock =;
/**
* @return массив, содержащий все сыры, имеющиеся в магазине,
* o null, если сыров для продажи нет.
*/
public Cheese[] getCheeses() {
if (cheesesInStock.size() == 0)
return null;
}
No hay motivo para tratar como caso especial una situación en la que no hay queso a la venta. Esto requiere que el cliente escriba código adicional para procesar el valor de retorno del método пull, por ejemplo:
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.");
en lugar de simple:
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.");
Este tipo de detalle es necesario para casi todas las llamadas a métodos que devuelven nulo en lugar de una matriz de longitud cero. Esto está plagado de errores, ya que es posible que el desarrollador del cliente no haya escrito un código especial para procesar el resultado null. El error puede pasar desapercibido durante años porque estos métodos suelen devolver uno o más objetos. También debe mencionarse que devolver nullen lugar de una matriz complica el método en sí que devuelve la matriz. A veces se argumenta que devolver un valor nulo es preferible a devolver una matriz de longitud cero porque evita el gasto de asignar la matriz en la memoria. Este argumento fracasa por dos razones. En primer lugar, no tiene sentido preocuparse por el rendimiento a este nivel a menos que el perfil del programa muestre que este método en particular es la razón principal de la degradación del rendimiento. En segundo lugar, cada llamada a un método que no devuelve registros puede pasar la misma matriz de longitud cero al cliente, porque cualquier matriz de longitud cero es inmutable y los objetos inmutables se pueden compartir. De hecho, esto es exactamente lo que sucede cuando usas el lenguaje estándar para volcar elementos de una colección en una matriz de tipo controlado:
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АУ);
}
En este modismo, una constante, como una matriz de longitud cero ,toArray se pasa a un método para indicar qué tipo debe devolver. Normalmente, el método toArrayasigna espacio de memoria para la matriz devuelta, pero si la colección está vacía, se coloca en la matriz de entrada y la especificación Сollесtion,tоАггау(Оbjесt[])garantiza que si la matriz de entrada es lo suficientemente grande como para contener la colección, eso es lo que se devuelve. Por lo tanto, el modismo presentado nunca asignará por sí mismo una matriz de longitud cero en la memoria, sino que utiliza una "constante específica de tipo" como tal. Resumamos. No hay ninguna razón para que un método de matriz devuelva un valor nulo en lugar de una matriz de longitud cero. Este modismo parece provenir del lenguaje de programación C, donde la longitud de una matriz se devuelve por separado de la propia matriz. En C, es inútil asignar memoria para una matriz de longitud cero. Fuente: Joshua Bloch, Programación efectiva de Java TM, Editorial Lori
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION