9
votes

Solution Java pour la directive sur le compilateur de style C ++

J'ai un tableau Java:

#ifdef ABC
  // ABC stuff here
#else
  // 123 stuff here
#endif


1 commentaires

Pas sûr, mais je pense que vous pouvez transmettre de telles choses à la JVM à l'aide de -dname = valeur , puis utilisez system.geproperty pour obtenir la valeur du nom .


7 Réponses :


1
votes
String[] myArray;

if (ABC)
myArray = ...
else
myArray = ...
ABC is static final variable, JVM is required to inline condition check.

0 commentaires

3
votes

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"}


4 commentaires

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.


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.



1
votes

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.

J'ai utilisé quelque chose de similaire dans le passé pour mettre la version et construire des informations à l'intérieur des classes Java.


0 commentaires

13
votes
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.

1 commentaires

Utilisez l'idée de libt des commentaires. Utilisez System.getProperty ("...") pour attribuer ABC.



1
votes

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 ++.

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.


0 commentaires

1
votes

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. XXX


1 commentaires

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.



0
votes

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


0 commentaires