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é está bloqueado esto por Java?
Sé cómo solucionarlo, 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í a jugar con matrices en Java.
Respuestas:
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 irrelevante ... la restricción está ahí, y tienes que vivir con ella.
Puedes escribir esto:
fuente
{o1()}
era una expresión válida y si{o1();}
era un bloque de declaración válido. El analizador tiene que llegar a '}' o ';' antes de que pueda distinguir los dos casos. ¡El problema gramatical no es sutil en absoluto!Trataré de responder la pregunta del 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 declaración cuánta memoria debe asignarse para la matriz. Un ArrayList es mucho más dinámico y su tamaño puede variar con el tiempo.
Si inicializa su matriz con la longitud de dos, y luego resulta que necesita una longitud de tres, debe desechar lo que tiene y crear una matriz completamente nueva. Por lo tanto, la palabra clave "nueva".
En sus primeros dos ejemplos, usted dice 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 y, por lo tanto, cuando se inicializa, debe crear explícitamente una nueva matriz para asignar la cantidad correcta de memoria.
Yo diría que (y si alguien sabe mejor, corrígeme) el primer ejemplo
en realidad significa
pero lo que hicieron los diseñadores de Java fue crear una forma más rápida de escribirlo si crea la matriz en el momento de la declaración.
Las soluciones sugeridas son buenas. Si el tiempo o el uso de la memoria es crítico en tiempo de ejecución, use matrices. Si no es crítico y desea un código que sea más fácil de entender y trabajar, use ArrayList.
fuente
{
y el}
... tal como lo hace para los formularios de inicializador que están permitidos.No puedo responder por qué parte.
Pero si quieres algo dinámico, ¿por qué no consideras Collection ArrayList?
ArrrayList puede ser de cualquier tipo de objeto.
Y si como una compulsión lo quieres como una matriz, puedes usar el método toArray () en él.
Por ejemplo:
Espero que esto te pueda ayudar.
fuente
Para aquellos de ustedes, a quienes no les gusta esta monstruosa
new AClass[] { ... }
sintaxis, aquí hay algo de azúcar:Utiliza esta pequeña función como quieras:
fuente