Sintaxis de inicialización de matriz cuando no está en una declaración

Resuelto Jason Rogers asked hace 13 años • 4 respuestas

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é Java bloquea esto?

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

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.

Jason Rogers avatar Mar 22 '11 13:03 Jason Rogers
Aceptado

¿Por qué Java bloquea esto?

Tendrías que preguntarle 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 el "por qué" es irrelevante... la restricción está ahí y hay que vivir con ella.

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

Puedes escribir esto:

AClass[] array;
...
array = new AClass[]{object1, object2};
Stephen C avatar Mar 22 '2011 06:03 Stephen C

Intentaré responder la pregunta del por qué: la matriz 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 se debe asignar para la matriz. Una ArrayList es mucho más dinámica y su tamaño puede variar con el tiempo.

Si inicializa su matriz con una longitud de dos y luego resulta que necesita una longitud de tres, debe desechar lo que tiene y crear una matriz completamente nueva. De ahí la palabra clave "nueva".

En los dos primeros ejemplos, usted 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.

Yo diría que (y si alguien lo sabe mejor, corríjame) el primer ejemplo

AClass[] array = {object1, object2}

en realidad significa

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

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 son críticos en tiempo de ejecución, utilice matrices. Si no es crítico y desea un código que sea más fácil de entender y trabajar, use ArrayList.

prograde avatar Dec 23 '2013 18:12 prograde

No puedo responder la parte del por qué.

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

ArrarrayList puede ser de cualquier tipo de objeto.

Y si como obligación lo desea como una matriz, puede usar el método toArray() en él.

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 pueda ayudarte.

Amanpreet avatar Mar 22 '2011 07:03 Amanpreet

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

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

Usa esta pequeña función como quieras:

AClass[] array;
...
array = c(object1, object2);
user123 avatar Mar 25 '2016 04:03 user123