2011-01-06 16 views

Respuesta

94

Significa que está vacío. Es decir. se puede reproducir indefinidamente como si tenía cosas y no tienen ningún resultado ocurrir:

for(int k = 0; k < strings.length; k++){ 
    // something 
} 

evitando así la necesidad de comprobar. Si el conjunto en cuestión fuera null, se produciría una excepción, pero en este caso simplemente no hace nada, lo que puede ser apropiado.

+6

También es útil para llamar a una función 'test (Object ... objects)' explicita cuando hay una función 'test()' – Frithjof

+1

@Frithjof: facepalm: –

20

A veces es mucho más amigable devolver una matriz de tamaño cero que nula.

+4

Esto se llama el patrón "Objeto nulo". –

5

Igual que C++, permite un manejo más limpio cuando no hay datos.

11

consideran este (una explicación más detallada de la respuesta del mediodía):

public String[] getStrings() { 
if(foo) { 
    return null; 
} else { 
    return new String[] {"bar, "baz"}; 
} 
} 

String[] strings = getStrings(); 
if (strings != null) { 
for (String s : strings) { 
    blah(s); 
} 
} 

Ahora lo comparan con esto:

public String[] getStrings() { 
if(foo) { 
    return new String[0]; 
} else { 
    return new String[] {"bar, "baz"}; 
} 
} 

// the if block is not necessary anymore 
String[] strings = getStrings(); 
for (String s : strings) { 
blah(s); 
} 

Este (volviendo matrices vacías en lugar de valores nulos), es, de hecho, una mejor práctica en el mundo del diseño API de Java.

Además, en Java, puede convertir Listas (por ejemplo, ArrayList) en matrices y solo tiene sentido convertir una lista vacía en una matriz vacía.

47

¿Por qué Java permite matrices de tamaño 1? ¿No es bastante inútil envolver un solo valor en una matriz? ¿No sería suficiente si Java solo permitiera arreglos de tamaño 2 o superior?

Sí, podemos pasar null en lugar de una matriz vacía y un solo objeto o primitiva en lugar de una matriz de tamaño-uno.

Pero hay algunos buenos argumentos en contra de tal restricción. Mis argumentos principales: personales

restricción es demasiado complicado y no es realmente necesario

Para limitar las matrices de tamaños [1..INTEGER.MAX_INT] tendríamos que añadir una gran cantidad de comprobaciones adicionales, boudary (acepte el comentario de Konrad) lógica de conversión y sobrecargas de métodos en nuestro código. Excluir 0 (y quizás 1) de los tamaños de matriz permitidos no ahorra costos, requiere un esfuerzo adicional y tiene un impacto negativo en el rendimiento.

modelos de matriz de vectores

Una matriz es un buen modelo de datos para un vector (matemáticas, no la clase Vector!). Y, por supuesto, un vector en matemáticas puede ser cero dimensional. Lo cual es conceptualmente diferente de ser inexistente.


Nota al margen - una envoltura prominente para una matriz (carac-) es la clase String. El String inmóvil materializa el concepto de una matriz vacía: es la cadena vacía ("").

+2

No creo su argumento de restricción. Java (a diferencia de, por ejemplo, C) ya requiere una verificación de números negativos. Esta comprobación podría adaptarse trivialmente para acomodar 0 (simplemente cambie '> = 0' a'> 0'). Pero, por supuesto, tienes razón sobre el resto, por lo que agregar esta restricción no sería significativo. –

+0

El argumento de iteración de bucle parece mejor en mi opinión: "para (int k = 0; k dannyxyz22

+2

No, no es para * mi * opinión, porque en un mundo sin matrices de tamaño cero, cadenas vacías (basadas en matrices de caracteres) simplemente no existirían y, por lo tanto, no habría ninguna necesidad de considerar matrices vacías en bucles. Este argumento de iteración es un efecto secundario muy práctico. En ese mundo, una matriz tendría una entrada como mínimo. (O dos porque: ¿por qué se necesitaría una matriz para un solo elemento?) –

2

Un caso en el que puedo pensar que una matriz vacía es extremadamente útil es utilizarla en lugar de nulo en una situación en la que no se permite nulo. Un posible ejemplo de eso es una BlockingQueue de matrices. Cuando quiera señalar el final de la entrada al lado de lectura, ¿qué haría? Enviar null parece una opción obvia, pero el problema es que BlockingQueue no acepta nulos. Puede envolver su matriz dentro de una clase con el tipo de campo "boolean last;", pero eso es un exceso. Enviar una matriz vacía (de tamaño cero) parece ser la elección más razonable.

4

Otro caso en el que una matriz de longitud cero puede ser útil: para devolver una matriz que contiene todos los elementos de una lista:

<T> T[ ] toArray(T[ ] a) 

Una matriz de longitud cero puede ser utilizado para pasar del tipo de la matriz en este método. Por ejemplo:

ClassA[ ] result = list.toArray(new ClassA[0]); 

Una matriz de longitud cero sigue siendo una instancia de Object que contiene cero elementos.

2

Sólo una nota:

Usted dice: "A diferencia de C, donde se puede aumentar dinámicamente el tamaño de una matriz, .." pero en C no se puede cambiar la dimensión de la matriz, lo mismo para C++.

0

Otro caso cuando una matriz de longitud cero es útil es cuando se copia una matriz bidimensional. Puedo escribir:

public int[][] copyArray(int[][] array){ 
    int[][] newArray = new int[array.length][0]; 
    for(int i=0;i<array.length;i++){ 
     newArray[i] = array[i]; 
    } 
    return newArray; 

ser que se sobrescribe cada referencia de matriz en matriz, la inicialización de ellos como refernces a matrices de longitud cero es más eficiente.

Cuestiones relacionadas