web-dev-qa-db-fra.com

Syntaxe d'initialisation de tableau lorsqu'elle n'est pas dans une déclaration

Je peux écrire:

AClass[] array = {object1, object2}

Je peux aussi écrire:

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

mais je ne peux pas écrire:

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

Pourquoi est-ce bloqué par Java?

Je sais comment y remédier, mais ce serait parfois plus simple.

Par exemple:

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;
        }
    }
}

Cette simple question me perturbe depuis que j'ai appris à jouer avec des tableaux en Java.

138
Jason Rogers

Pourquoi est-ce bloqué par Java?

Il vous faudrait demander aux concepteurs Java. Il pourrait y avoir une raison grammaticale subtile pour cette restriction. Notez que certaines des constructions de création/initialisation de tableau ne sont pas dans Java 1.0, et (IIRC) ont été ajoutées dans Java 1.1.

Mais "pourquoi" n'a aucune importance ... la restriction est là et vous devez vivre avec.

Je sais comment y remédier, mais de temps en temps, ce serait plus simple.

Vous pouvez écrire ceci:

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

Je vais essayer de répondre à la question de pourquoi: Le tableau Java est très simple et rudimentaire par rapport à des classes plus dynamiques comme ArrayList. Java veut savoir au moment de la déclaration combien de mémoire devrait être allouée au tableau. Une ArrayList est beaucoup plus dynamique et sa taille peut varier dans le temps.

Si vous initialisez votre tableau avec une longueur de deux, et que plus tard, il vous faut une longueur de trois, vous devez jeter ce que vous avez et créer un tout nouveau tableau. Par conséquent, le mot clé "nouveau".

Dans vos deux premiers exemples, vous indiquez au moment de la déclaration la quantité de mémoire à allouer. Dans votre troisième exemple, le nom du tableau devient un pointeur vers rien du tout et, par conséquent, lorsqu'il est initialisé, vous devez créer explicitement un nouveau tableau pour allouer la bonne quantité de mémoire.

Je dirais que (et si quelqu'un sait mieux, corrigez-moi s'il vous plaît) le premier exemple

AClass[] array = {object1, object2}

signifie en réalité

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

mais ce que les concepteurs Java ont fait, c’était de créer un moyen plus rapide de l’écrire si vous créez le tableau au moment de la déclaration.

Les solutions de contournement suggérées sont bonnes. Si l'utilisation de l'heure ou de la mémoire est critique au moment de l'exécution, utilisez des tableaux. Si ce n'est pas critique et que vous voulez un code plus facile à comprendre et à utiliser, utilisez ArrayList.

18
prograde

Je ne peux pas répondre à la partie pourquoi.

Mais si vous voulez quelque chose de dynamique, pourquoi ne pas envisager Collection ArrayList?.

ArrrayList peut être de n'importe quel type d'objet.

Et si vous le voulez comme un tableau, vous pouvez utiliser la méthode toArray () dessus.

Par exemple:

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

J'espère que cela pourrait vous aider.

8
Amanpreet

Pour ceux d'entre vous qui n'aiment pas cette syntaxe monstrueuse de new AClass[] { ... }, voici du sucre:

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

Utilisez cette petite fonction comme bon vous semble:

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