Un Commutateur de Java problème : le cas des expressions doivent être des expressions constantes
J'ai un problème dans mon switch/case déclaration. Le message d'erreur indique : "Cas des expressions doivent être des expressions constantes". Je comprends l'erreur, et je peux le résoudre à l'aide de Si mais quelqu'un peut-il me dit pourquoi le cas de l'expression doit être une constante dans un switch/case.
Un exemple de code de mon erreur :
public boolean onOptionsItemSelected(MenuItem item) {
int idDirectory = ((MenuItem) findViewById(R.id.createDirectory)).getItemId();
int idSuppression = ((MenuItem) findViewById(R.id.recycleTrash)).getItemId();
int idSeeTrash = ((MenuItem) findViewById(R.id.seeTrash)).getItemId();
switch (item.getItemId()) {
case idDirectory:
createDirectory(currentDirectory);
break;
case idSuppression:
recycleTrash();
break;
case idSeeTrash:
seeTrash();
break;
}
return super.onOptionsItemSelected(item);
}
Merci pour votre explication!!!
- Pourquoi êtes-vous à l'aide de
findViewById().getItemId()
? Si vous avez déjà l'id, vous n'avez pas besoin d'obtenir de l'élément pour obtenir l'id! - instructions de commutation sont une mauvaise odeur... je vous recommande de regarder dans l'utilisation du polymorphisme ou de l'adaptateur afin de parvenir à une meilleure recherche de code. En outre, vous pouvez éviter de tels problèmes tout à fait.
- Je suis d'accord, spécialement lorsque la condition se répète assez souvent. Si vous l'utilisez rarement, il peut être ok. Aussi, je l'utilise parfois avec le polymorphisme pour créer l'initiale de béton instance.
- Depuis Dimitri utilisant Android, son
MenuItem
objets sont susceptibles défini en xml et (à ma connaissance) ne peut pas être facilement sous-classé, sans renoncer à la simplicité deMenuInflater.inflate()
.
Vous devez vous connecter pour publier un commentaire.
De sorte qu'il peut être évalué lors de la phase de compilation ( statiquement vérifier )
Voir: http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.11 pour une définition formelle de la
switch
.En outre, il peut vous aider à mieux comprendre comment que
switch
est transformé en bytecode:Et après la compilation:
Voir que la ligne marquée comme
1:
Il évalue la valeur et passe à une autre ligne. Par exemple, si la valeur est
9
il saute à l'instruction 39:Qui saute à l'instruction 58 :
Tout cela ne serait pas possible si elle a été évaluée de façon dynamique. C'est pourquoi.
javap
est un autre outil ( comme javadoc ou jar ) qui est la valeur par défaut de java dissambler. Lorsqu'elle est invoquée avec-c
vous verrez ces instructions.dans eclipse IDE est simple ,dans le commutateur de phrase CTRL + 1 et convertir switch phrase - si-sinon la phrase http://tools.android.com/tips/non-constant-fields
La
idDirectory
et d'autres, doivent être une constante et non une variable déclarée.Switch
ne fonctionnera pas dans ce cas, vous devez passer àif-else
construire.MODIFIER je vois ce que l'OP voulait dire. C'est juste comment commutateur fonctionne en langage java.