660 votes

Y a-t-il un moyen de déclarer un tableau en ligne ?

Disons que j'ai une méthode m() qui prend un tableau de chaînes de caractères comme argument. Existe-t-il un moyen de déclarer ce tableau en ligne lorsque je fais l'appel ? par exemple, au lieu de :

String[] strs = {"blah", "hey", "yo"};
m(strs);

Puis-je remplacer cela par une seule ligne, et éviter de déclarer une variable nommée que je ne vais jamais utiliser ?

2 votes

Un IDE qui prend en charge la refactorisation vous permettrait de mettre les strs en ligne automatiquement.

1007voto

Draemon Points 15448
m(new String[]{"blah", "hey", "yo"});

92 votes

Pour mémoire, ce type de tableau est connu sous le nom de tableau anonyme (car il n'a pas de nom). Une recherche sur "Anonymous array java" aurait donné quelques résultats.

3 votes

Il s'agit du rare cas où une réponse uniquement codée est tout à fait acceptable, voire préférable.

0 votes

@Falaina Le tableau n'a pas un type différent (anonyme) simplement parce que la référence n'est pas stockée dans une variable de la portée immédiate. Le tableau a toujours une identité d'objet, sa référence est passée et liée au paramètre de la méthode. Je n'ai jamais entendu parler d'objets anonymes. Je ne vois aucune comparaison avec les classes anonymes, où il y a une nouvelle définition de classe sans nom. Désolé pour cette vieille réponse, je cherche des informations sur les tableaux en ligne potentiels.

124voto

Michael Myers Points 82361

Draemon a raison. Vous pouvez également déclarer m comme prenant varargs :

void m(String... strs) {
    // strs is seen as a normal String[] inside the method
}

m("blah", "hey", "yo"); // no [] or {} needed; each string is a separate arg here

22 votes

C'est une belle syntaxe, mais avec cette méthode, vous ne pouvez avoir qu'un seul paramètre de tableau, et il doit être le dernier. Donc, vous ne pouvez pas faire : void m(String... strs, Integer... intgrs) par exemple.

6 votes

Blefoot a raison. Mais vous pouvez faire void m(Integer i, Double d, String... str)

0 votes

@MichaelMyers Quelle est la signification de (String ... strs)

31voto

ton1n8o Points 43

Une autre façon de procéder, si vous voulez que le résultat soit une liste en ligne, vous pouvez le faire comme ceci :

Arrays.asList(new String[] { "String1", "string2" });

44 votes

Vous n'avez pas besoin de créer un tableau, vous pouvez le faire simplement : Arrays.asList("string1", "string2", ...)

2 votes

Point éventuellement utile : vous ne pouvez pas faire cela avec des primitives. Vous vous retrouverez avec un élément unique List de type[] donde type est aussi primitif. Par exemple Arrays.asList([some ints]) donne lieu à un List<int[]> .

0 votes

@Antonio Carlos : non, ce n'est pas le cas. Vous pouvez appeler set sur le retour List et il modifiera le tableau.

3voto

Bill K Points 32115

J'aimerais ajouter que la syntaxe d'initialisation des tableaux est très succincte et flexible. Je l'utilise BEAUCOUP pour extraire des données de mon code et les placer à un endroit plus utilisable.

À titre d'exemple, j'ai souvent créé des menus comme celui-ci :

Menu menu=initMenus(menuHandler, new String[]{"File", "+Save", "+Load", "Edit", "+Copy", ...});

Cela me permettrait d'écrire le code à venir pour mettre en place un système de menus. Le "+" est suffisant pour lui dire de placer cet élément sous l'élément précédent.

Je pourrais le lier à la classe menuHandler soit par une convention de dénomination des méthodes en nommant mes méthodes quelque chose comme "menuFile, menuFileSave, menuFileLoad, ..." et en les liant par réflexion (il existe d'autres alternatives).

Cette syntaxe permet une définition de menu incroyablement brève et une méthode "initMenus" extrêmement réutilisable. (Pourtant, je ne me donne pas la peine de la réutiliser car elle est toujours amusante à écrire et ne prend que quelques minutes + quelques lignes de code).

chaque fois que vous voyez un modèle dans votre code, voyez si vous pouvez le remplacer par quelque chose comme ceci, et rappelez-vous toujours combien la syntaxe d'initialisation des tableaux est succincte !

5 votes

Il serait également préférable de le faire en tant que varargues. De plus, toute personne qui aime taper du code pour le "fun" mérite un downvote ! Le codage consiste à résoudre de nouveaux problèmes, pas à taper. Oh, attendez, c'est Java ;-)

1 votes

Vous avez raison, lorsque j'ai écrit ceci, je n'avais pas beaucoup utilisé les varargs - et j'ai utilisé l'initialisation des tableaux bien avant que les varargs n'existent en Java. La seule partie pour laquelle je préfère encore les tableaux est que si vous les définissez comme des tableaux, vous pouvez en faire une constante en haut du fichier au lieu de données en ligne, et vous pouvez également les extraire dans un fichier de configuration.

0 votes

D'ailleurs, huit ans plus tard, je dois dire que je me retrouve maintenant à utiliser des annotations pour faire presque toutes les choses pour lesquelles j'avais l'habitude d'utiliser des tableaux de chaînes initialisées.

1voto

Comme le dit Draemon, ce que Java a de plus proche des tableaux en ligne est new String[]{"blah", "hey", "yo"} Cependant, il existe une astuce qui vous permet de faire quelque chose comme

array("blah", "hey", "yo") avec le type automatiquement déduit.

J'ai travaillé sur une API utile pour augmenter le langage Java afin de permettre les tableaux en ligne et les types de collection. Pour plus de détails, cherchez le projet Espresso4J sur Google ou consultez-le. aquí

10 votes

Juste un ou deux problèmes ici : 1. Veuillez vous assurer que dans vos messages et votre profil, vous indiquez clairement que vous êtes affilié à Espresso4J (voir notre site web). FAQ ) 2. soyez prudent lorsque vous publiez des liens vers votre propre site web sur des messages assez anciens (en particulier des réponses passe-partout comme celle-ci et celle-là). celui-ci ) - cela donne l'impression d'être du spam et soulève des signaux qui entacheront votre réputation.

0 votes

@Kev ah désolé. J'ai précisé que je suis le développeur de l'excellent projet Espresso4J maintenant :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X