Array de syntax de inicialización cuando no está en una statement

Puedo escribir:

AClass[] array = {object1, object2} 

También puedo escribir:

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

pero no puedo escribir

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

¿Por qué esto está 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 me ha estado molestando desde que aprendí a jugar con matrices en Java.

¿Por qué esto está bloqueado por Java?

Tendría que preguntarle a los diseñadores de Java. Puede haber alguna razón gtwigtical 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 eso.

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

Puedes escribir esto:

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

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

Si inicializas tu matriz con la longitud de dos, y luego resulta que necesitas una longitud de tres, debes descartar lo que tienes y crear una matriz completamente nueva. Por lo tanto, la palabra clave ‘nueva’.

En los primeros dos ejemplos, le dice a la hora de la statement 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 eso (y si alguien sabe mejor, por favor corrígeme) el primer ejemplo

 AClass[] array = {object1, object2} 

en realidad significa

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

pero lo que los diseñadores de Java hicieron fue crear una forma más rápida de escribirlo si creas la matriz en el momento de la statement.

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.

No puedo responder la parte del por qué.

Pero si quiere algo dynamic, ¿por qué no considera Collection ArrayList?

ArrrayList puede ser de cualquier tipo de objeto.

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

Por ejemplo:

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

Espero que esto te pueda ayudar.

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

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

Use esta pequeña función como quiera:

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