2010-02-09 5 views
4

Est-il possible de définir une variable, si je veux qu'elle soit flexible? Je pense qu'un exmaple le rend plus facile à comprendre.Appel d'une variable par son nom, qui n'est pas connu lors de la compilation

String hallo1; 
String hallo2; 

for(int i = 0; i < 2; i++) { 
hallo & i = Integer.toString(i); 
} 
+1

Désolé l'exemple ne le rend pas plus claire – Mark

+4

Ceci est une demande commune des débutants. Habituellement, la solution correcte consiste à utiliser un tableau, une liste, un ensemble ou une carte. –

+0

Je ne veux pas faire un String-Array. La chaîne n'est qu'un exemple. J'ai un GridLayout (3,3) et dans chaque champ un GridLayout (3,3) à nouveau. maintenant je veux faire les 81 étiquettes comme: field_A1_A1, field_A1_A2 ... etc ... Peut-être que maintenant vous comprenez mon problème. – rakete

Répondre

2

Si vous avez vraiment besoin de variables dont les noms ne sont pas connus au moment de la compilation, vous pouvez obtenir cet effet en créant une structure qui contient des noms et des valeurs arbitraires. Comme, vous pouvez créer un HashMap où la clé est le nom. Ensuite, votre exemple ci-dessus devient quelque chose comme:

HashMap myData=new HashMap(); 
    for (int i=0;i<2;++i) 
    { 
    myData.put("hallo"+i,Integer.toString(i)); 
    } 

plus tard Vous les tirez avec:

String whatever=myData.get("hallo1"); 

etc.

Bien sûr, vous ne pouvez pas accéder aux valeurs de la carte en tant que variables directement, vous devez toujours mettre et mettre à jour et les récupérer, mais le concept est le même. Cela dit, je serais très prudent à ce sujet, car cela rend le code difficile à maintenir. Si les noms dont vous avez besoin sont vraiment à l'improviste - si vous écrivez du code générique pour lire une table de base de données arbitraire dont le nom a été tapé par l'utilisateur à l'exécution ou quelque chose comme ça - cool. Mais si vous pensez que cela est un raccourci pratique pour quelque chose comme:

if (region.equals("1")) 
    region1Total+=amount; 
    else 
    region2Total+=amount; 

Ma réponse simple serait NE PAS !! Le code est beaucoup plus facile à maintenir si vous utilisez l'instruction IF et les variables normales. Alors quiconque lisant le code peut regarder vos déclarations et voir quelles sont toutes les variables possibles. Vous pouvez faire des recherches de texte pour trouver partout où ils sont utilisés. Si vous mal orthographiez un nom de variable, au lieu de créer une nouvelle variable par magie, vous obtiendrez un message d'erreur propre à la compilation. Etc.

D'autre part, si vous pouvez écrire quelque chose comme

String n=getInputFromScreen(); 
    String s=getAnotherInputFromScreen(); 
    hallo & n = s; 

vous auriez aucune idée de ce que les variables existent dans votre programme et aucun moyen de suivre où ils sont utilisés.

13

Non, vous ne pouvez pas. Il n'y a (heureusement) rien de tel que eval() en Java. Le meilleur moyen est de saisir un Array ou un ArrayList. Voici un exemple de tableau:

+2

+1 pour le "heureusement". Ce genre de chose dans les langages de script les rend très difficiles à maintenir. Il n'y a aucun moyen de dire où une variable est utilisée. – Jay

0

Non, la façon de faire quelque chose comme ceci est avec un tableau, une liste, ou quelque chose de similaire. Il est également plus intuitif de les regrouper, puis de faire flotter de nombreuses variables (qui devraient vraiment être liées). Il n'y a aucun moyen de le faire - en Java, au moins. Je l'ai vu cela dans les langages de script, mais qui est tout à fait différent ...

+0

Un tableau n'est pas le seul moyen. Vous pouvez également utiliser une liste ou une carte ou ... –

+0

@Joachim Sauer - Merci, je viens de réaliser que mon libellé sonnait limitant. Je vais changer ça. – froadie

4

Il est techniquement possible reflection, mais je déconseillerais à moins que vous avez un vraiment bonne raison de le faire. Cela rendrait votre code beaucoup plus difficile à déboguer et à lire.

EDIT:
Comme les commentaires ont souligné:

  1. Pour clarifier les choses, je vous suggère fortement pas à tenter d'utiliser la réflexion. Les autres réponses indiquent les meilleurs moyens d'atteindre votre objectif, tels qu'un tableau.
  2. La réflexion ne vous aidera pas avec les variables locales.
+4

Variables non locales. –

+1

Je ne sais pas pourquoi Eli a été downvoted sur celui-là. Bien sûr, vous ne pouvez pas le faire avec des variables locales. Mais il n'est pas du tout évident que l'utilisation de variables locales était une exigence. Comme Eli, je recommande d'être très prudent sur l'utilisation de la réflexion car cela rend le code beaucoup plus difficile à lire et à maintenir. Mais cela peut être fait. – Jay

+1

La restriction de non-variables locales est juste un inconvénient de cela. À mon avis le problème avec cette suggestion est que des questions comme celles-ci sont habituellement posées parce que quelqu'un ne connaît pas les tableaux/collections et essaie de faire quelque chose pour lequel ils seraient parfaitement adaptés. Suggérer une réflexion dans un tel cas ne ferait que les envoyer sur un chemin long et dangereux qui ne mène nulle part. –

0

Vous pouvez utiliser un tableau de chaînes.
Quelque chose comme:

String[] hallos = new String[10]; 

//when looping you can use regular (counter) loop or for each loop 
for (String s: hallos){ 
     //do whatever you want with each String 
} 
+1

Soyez prudent lorsque vous présentez une boucle foreach ici, car la question concerne la définition de variables et l'affectation à 's' n'aura pas l'effet voulu avec ce code (c'est-à-dire que cela ne changera pas' hallos'). –

+0

je sais, c'est pourquoi je n'ai pas mis le même corps pour la boucle. Il suffit d'enseigner à l'OP comment utiliser pour chaque boucle. – medopal

Questions connexes