J'ai un tableau Java:
#ifdef ABC // ABC stuff here #else // 123 stuff here #endif
7 Réponses :
String[] myArray; if (ABC) myArray = ... else myArray = ... ABC is static final variable, JVM is required to inline condition check.
en Java, vous auriez besoin de le faire au moment de l'exécution.
String[] myArray;
if (something)
myArray = new String[]{"A", "B"};
else
myArray = new String[]{"A", "B, "C"}
Merci, cela fonctionnera certainement - le compilateur optimisera-t-il la partie si "quelque chose" est toujours vrai ??
En fait, oui. Si vous avez ce quelque chose, il est toujours vrai, cela optimisera le si. Code>
Bien sûr ... j'ai totalement mérité le bowvote. Merci d'avoir remarqué!!
L'utilisation de cette "constantes de tableau ne peut être utilisée que dans les initialiseurs", mais myarray = nouvelle chaîne [] {"A", "B"}; résolu le problème.
Une approche consiste à renouveler un fichier de constantes.java dans la première phase de votre script de construction (fourmi, maven ou autre que vous utilisez). En fonction de la complexité de ce fichier, vous pouvez le faire manuellement ou utiliser quelque chose de plus lourd comme une vitesse. P>
J'ai utilisé quelque chose de similaire dans le passé pour mettre la version et construire des informations à l'intérieur des classes Java. P>
class Foo {
static final boolean ABC = true;
public void someMehod() {
if (ABC) { // #ifdef ABC
} else { // #else
} // #endif
}
}
since ABC is both static and final the compiler evaluates it at compile-time, effectively acting like a pre-processor.
Utilisez l'idée de libt des commentaires. Utilisez System.getProperty ("...") pour attribuer ABC.
Utilisez un moteur de modèle (quelque chose comme la vélocité) pour exécuter une étape de prétraitement. Votre script de construction pourrait exécuter le modèle d'application des propriétés de l'environnement de construction pour produire le code source Java qui est finalement compilé. Ceci est essentiellement ce que font les préprocesseurs C / C ++. P>
Je suppose que quelqu'un a déjà codé une tâche de fourmi pour le faire, mais je suis trop paresseux pour Google pour vous. P>
Si vous utilisez un Var / Const comme une directive de compilateur personnalisée en Java ne le rendez pas final. Vous pouvez obtenir beaucoup d'avertissements à cause des conditions «toujours vraies» et des trucs.
Point juste sur les avertissements, mais si vous n'avez pas cette variable être finale, le compilateur ne peut pas optimiser le bloc if / sinon.
Vous ne pouvez pas vraiment le faire ... Le meilleur moyen d'utiliser un moteur de modèle ... Même certains compilateurs mettront le code dans le fichier de classe d'extrémité - les meilleurs supprimeraient le code s'il n'est pas nécessaire ... Vous devez rendre la finale des constantes et vous devez également les définir à une valeur absolue pour que le compilateur puisse supprimer le code.
public static final boolean ABC = true // This will be enough for the compiler to remove code public static final boolean ABC = [any method call] // This is not enough to work and will leave the code in there
Pas sûr, mais je pense que vous pouvez transmettre de telles choses à la JVM à l'aide de
-dname = valeur code>, puis utilisezsystem.geproperty code> pour obtenir la valeur du nom code>.