2011-03-22 9 views
134

me puede escribir:matriz cuando no esté en una declaración

AClass[] array = {object1, object2} 

también puedo escribir:

AClass[] array = new AClass[2]; 
... 
array[0] = object1; 
array[1] = object2; 

pero no puede escribir:

AClass[] array; 
... 
array = {object1, object2}; 

¿Por qué es esto bloqueado por Java?

Sé cómo evitarlo, pero de vez en cuando sería más simple.

Por ejemplo:

public void selectedPointsToMove(cpVect coord) { 

    if (tab == null) { 
     if (arePointsClose(coord, point1, 10)) { 
      cpVect[] tempTab = {point1}; 
      tab = tempTab; 
     } else if (arePointsClose(point2, coord, 10)) { 
      cpVect[] tempTab = {point2}; 
      tab = tempTab; 
     } else { 
      cpVect[] tempTab = {point1,point2}; 
      tab = tempTab; 
     } 
    } 
} 

Esta simple pregunta que me ha estado molestando desde que aprendí cómo jugar con las matrices en Java.

+0

sentimos sobre el formato de texto, sino por alguna razón, en China, los botones de diseño de texto no aparecen: S –

+0

para el código, solo asegúrese de que esté sangrado con 4 espacios o más. – Mat

+0

el otro problema es que tenía caracteres TAB en el código que pegó. Esto arruina el formateo. –

Respuesta

131

¿Por qué está bloqueado por Java?

Tendrías que preguntar a los diseñadores de Java. Puede haber alguna razón gramatical sutil para la restricción. Tenga en cuenta que algunas de las construcciones de creación/inicialización de matrices no estaban en Java 1.0, y (IIRC) se agregaron en Java 1.1.

Pero "por qué" es inmaterial ... la restricción está ahí, y tienes que vivir con ella.

Sé cómo evitarlo, pero de vez en cuando sería más simple.

Puede escribir lo siguiente:

AClass[] array; 
... 
array = new AClass[]{object1, object2}; 
+7

sin la nueva declaración no habría diferencia entre un bloque de instrucciones y el inicializador de matriz (como en javascript, que puede ser engañoso) – bestsss

+9

* sería * confuso ... y difícil de analizar. Considere si '{o1 ()} 'era una expresión válida y' {o1();} 'era un bloque de instrucción válido. El analizador debe llegar al '}' o ';' antes de poder distinguir los dos casos. El problema gramatical no es sutil en absoluto! –

+0

¿Podría explicar en qué matriz la sintaxis de creación no era compatible en Java 1.0? – Nayuki

7

No puedo responder a la razón por la parte.

Pero si quieres algo dinámico, ¿por qué no consideras Collection ArrayList?

ArrrayList puede ser de cualquier tipo.

Y si como compulsión lo quieres como una matriz, puedes utilizar el método toArray() en ella.

Por ejemplo:

  ArrayList<String> al = new ArrayList<String>(); 
      al.add("one"); 
      al.add("two"); 
      String[] strArray = (String[]) al.toArray(new String[0]); 

espero que esto podría ayudarle.

+2

No hay necesidad de convertir el tipo de retorno de la matriz a Cadena []. Por contrato, la matriz devuelta es del mismo tipo que la matriz especificada. http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html#toArray (T []) – abc

15

Trataré de responder la pregunta por qué: La matriz de Java es muy simple y rudimentaria en comparación con las clases como ArrayList, que son más dinámicas. Java quiere saber en el momento de la declaración cuánta memoria debe asignarse para la matriz. Un ArrayList es mucho más dinámico y el tamaño del mismo puede variar con el tiempo.

Si inicializa su matriz con la longitud de dos, y luego resulta que necesita una longitud de tres, tiene que tirar lo que tiene y crear una matriz completamente nueva. Por lo tanto, la palabra clave 'nueva'.

En sus dos primeros ejemplos, indica en el momento de la declaración cuánta memoria asignar. En su tercer ejemplo, el nombre de la matriz se convierte en un puntero a nada en absoluto, y por lo tanto, cuando se inicializa, debe crear explícitamente una nueva matriz para asignar la cantidad correcta de memoria.

diría que (y si alguien conoce mejor, por favor, corríjanme) el primer ejemplo

AClass[] array = {object1, object2} 

significa en realidad

AClass[] array = new AClass[]{object1, object2}; 

pero lo que hicieron los diseñadores de Java, fue para dar paso más rápido escribirlo si creas la matriz en el momento de la declaración.

Las soluciones sugeridas son buenas. Si el tiempo o el uso de memoria es crítico en el tiempo de ejecución, use matrices. Si no es crítico, y quiere un código que sea más fácil de entender y trabajar, use ArrayList.

+1

Este es un atajo como usted ha indicado, Citando Oracle: ["Alternativamente, usted puede usar la sintaxis de acceso directo para crear e inicializar una matriz "] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html).La razón quizás sea que * una matriz debe tener espacio en la memoria * usando nueva en algún punto. Nuevo está implícito en el acceso directo, pero el acceso directo es válido solo en la declaración. En otros lugares, no hay acceso directo permitido, y nuevo es obligatorio. – mins

+2

Lo siento, pero su intento de responder la pregunta "por qué" no se sostiene. El compilador podría calcular qué tan grande debía ser la matriz al contar las expresiones entre '{' y '}' ... al igual que lo hace para los formularios de inicialización que están permitidos. –

4

Para aquellos de ustedes, que no le gusta esta sintaxis monstruosa new AClass[] { ... }, aquí está un poco de azúcar:

public AClass[] c(AClass... arr) { return arr; } 

Utilice esta función poco como desee:

AClass[] array; 
... 
array = c(object1, object2); 
Cuestiones relacionadas