Syntaxe d’initialisation de tableau lorsqu’il 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 le contourner, mais de temps en temps, ce serait 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 qui me gêne depuis que j’ai appris à jouer avec des tableaux en Java.

Pourquoi est-ce bloqué par Java?

Vous devriez demander aux concepteurs Java. Il pourrait y avoir une raison grammaticale subtile à la ressortingction. Notez que certaines des constructions de création / initialisation du tableau n’étaient pas en Java 1.0 et que (IIRC) ont été ajoutées en Java 1.1.

Mais “pourquoi” est sans importance … la ressortingction est là et vous devez vivre avec.

Je sais comment le contourner, mais de temps en temps, ce serait plus simple.

Vous pouvez écrire ceci:

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

Je vais essayer de répondre à la question pourquoi: le tableau Java est très simple et rudimentaire par rapport aux classes comme ArrayList, qui sont plus dynamics. Java veut savoir au moment de la déclaration quelle quantité de mémoire doit être allouée pour le tableau. Une ArrayList est beaucoup plus dynamic et sa taille peut varier avec le temps.

Si vous initialisez votre tableau avec une longueur de deux, et plus tard il vous faudra trois longueurs, vous devez jeter ce que vous avez et créer un 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 et, par conséquent, lorsqu’il est initialisé, vous devez créer explicitement un nouveau tableau pour allouer la quantité de mémoire appropriée.

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

 AClass[] array = {object1, object2} 

signifie réellement

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

mais ce que les concepteurs de Java ont fait, c’est d’écrire plus rapidement si vous créez le tableau au moment de la déclaration.

Les solutions de contournement suggérées sont bonnes. Si l’utilisation du temps 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 du code plus facile à comprendre et à utiliser, utilisez ArrayList.

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

Mais si vous voulez quelque chose de dynamic, alors pourquoi ne pas considérer Collection ArrayList?

ArrrayList peut être de n’importe quel type d’object.

Et si vous le souhaitez en tant que tableau, vous pouvez utiliser la méthode toArray ().

Par exemple:

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

J’espère que cela pourrait vous aider.

Pour ceux d’entre vous qui new AClass[] { ... } pas cette new AClass[] { ... } monstrueuse new AClass[] { ... } , voici du sucre:

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

Utilisez cette petite fonction comme vous le souhaitez:

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