in C \ C ++ code> peut définir: #ifndef <token>
/* code */
#else
/* code to include if the token is defined */
#endif
6 Réponses :
Les coups que vous avez collés ci-dessus était un Compilation conditionnelle Macro destiné au préprocesseur qui " Transforme "votre code source avant la compilation. p>
Java n'a pas la construction de langues équivalente, de sorte que l'anser est que vous ne pouvez pas faire cela. p>
edit: strong> Vous pouvez utiliser des conditions régulières pour atteindre votre objectif, car ce compilateur optimisera le bytecode de telle manière que souhaité (merci pour @stHePharc pour la pointe de cette sortie). p>
Mais je préfère personnellement étendre l'API pour le débogage si nécessaire qui cachera les détails de la mise en œuvre et peuvent être modifiés d'exécution. Bien sûr, c'est un scénario spécifique. P>
Par exemple, cela serait similaire à Log4J-S API , qui vous permet de vérifier si votre code est en mode de débogage ou non. p>
Je recommanderais l'utilisation de ce modèle parce que cela ne casse pas (trop :) Nos concepts axés sur l'objet bien-aimé. P>
"Vous pouvez utiliser cependant des conditions régulières pour atteindre votre objectif, mais cela n'affectera pas le processus de construction en fonction de votre jeton." I> - pas strictement vrai. Si la condition est une expression constante du temps de compilation, le code est littéralement éliminé au moment de la compilation.
Oui, c'est vrai mais contrairement à C / C ++ lorsque les macros de préprocesseur indiquent explicitement quelles parties à couper, en Java, les mécaniciens que vous avez décrits sont implicites, donc non visibles à partir du code source.
1) Il est B> visible dans le code source. Tout ce que vous avez à faire est LOOK B> pour les drapeaux constants de la compilation et où ils sont utilisés. Ok, ça ne se démarque pas comme un pouce douloureux ... comme #Ifdef code> fait. 2) vous devriez corriger la mauvaise erreur que j'ai signalé, et que (je pense) que vous reconnaissez
La réponse est Non. Pas dans le sens où vous voulez dire.
La façon dont vous faites ce genre de chose en Java comme suit: p> Java n'a pas de pré-processus (comme C et C ++ le faire). Cependant, le compilateur optimisera la branche inutilisée d'une instruction (IIRC, ce comportement est spécifié dans les JLS ... ce qui signifie que vous pouvez compter sur n'importe quel Compilateur Java pour le faire.) P> @treebranch commente que "ceci" peut provoquer un gonfleur de code. P> Si @treebranch parle de codes d'objet BLOAT, ce n'est pas vrai. Si vous faites ce droit avec des drapeaux / expressions qui compilent des expressions constantes de temps, telles que définies par les JLS, le compilateur n'émet aucun bytecodes pour le code source "conditionnellement exclu". Voir la réponse de @ Edalorso. P> li>
Si @treebranch est en train de parler de gonfleur de code source, je suis d'accord. Mais vous pouvez dire la même chose pour Java a une meilleure façon de traiter les différences de plate-forme, les variations de fonctionnalités, etc.: utiliser reliure dynamique em>. Si vous avez beaucoup de classes de plug-in différents dans votre pot, traitez-la (Bytecode BLOAT), traitez-la en créant un fichier JAR différent pour chaque plate-forme, ou autre. P> LI>
ol> p> si code> comme ci-dessus, à condition que indicateur code> est une expression constante de la compilation. Ceci est une forme limitée de compilation conditionnelle. Notez que le contrôlant Constant code> constante peut être importé à partir d'une classe différente. P>
#Ifdef code> compilation conditionnelle. (Macros et #include code> peut être utilisé pour réduire le flucteur de code source ... mais uniquement au coût de la lisibilité, de la maintenabilité, etc. et que les concepteurs Java ont refusé de soutenir toute source -Code prétraitement.) p> li>
L'OP a demandé "Y a-t-il un moyen de le faire en Java? (qui ne définit pas une variable statique globale ..) i>" "
Java n'a pas de variables globales ... si techniquement que le cavalier est discutable.
On pourrait soutenir que les champs code> statiques code> sont l'équivalent des variables globales par ex. C ++ (du point de vue d'utilisation au moins) ... Mais votre interprétation est confirmée par l'acceptation de l'OP, de sorte que vous obtenez mon +1 aussi :-)
@ Pétertörök - Les champs finaux statiques ne sont pas globaux en ce sens que les variables peuvent être globales en C, C ++ et Fortran. Ils doivent être qualifiés avec un nom de classe, et même alors ils ne sont pas nécessairement visibles. En outre, ma réponse dit "Non - pas ce que vous voulez dire que vous voulez dire" i>.
Il n'y a rien comme la compilation conditionnelle en Java. (comme Xea a dit) p>
Selon le problème, vous souhaitez résoudre différents moyens de faire quelque chose de similaire. P>
One est d'utiliser une variable finale statique définie sur une constante de temps de compilation (comme Stephen écrit). Le compilateur n'inclut pas le code octet pour le chemin impossible. Mais il doit toujours être légal Java, ce qui signifie que vous ne pouvez pas déclarer une variable dans un bloc de ces blocs et l'utiliser dans une autre. P>
I Tous les cas que j'ai vus jusqu'à présent, on pourrait le résoudre à l'aide de constructions de OO. Par exemple, vous pouvez remplacer votre if d'autre avec un appel à une méthode abstraite et fournir un débogage et une mise en œuvre de la production. P>
Java en tant que langue n'a pas ou pré-traitement des macros similaires comme C ou C ++, cependant, il y a certains < a href = "http://www.slashdev.ca/javapp/" rel = "nofollow"> 3ème partie préprocesseur -tools, qui peut gérer les choses comme celles-ci. Pour une utilisation pratique, vous aurez besoin de les câbler dans un Maven- ou Ant-construction. P>
Je pense que ce que @Stephenc a proposé est une bonne option. Vous pouvez également essayer d'utiliser S'il s'agit d'une approche qui vous intéresse, consultez: aspectj et Guide de référence . P>
Je serais à être d'accord ... Néanmoins, c'est une approche pour le PO à considérer. En fin de compte, tout cela compile de bytecode.
L'approche suggérant que l'utilisation de la variable finale statique booléenne est la plus proche de cette fonctionnalité suggérée car elle est même optimisée par le compilateur. Si le drapeau est défini sur FALSE, les bytecodes contenus dans le bloc ne sont même pas générés.
Permettez-moi d'afficher un exemple: p> ceci génère les bytecodes p> mais si nous éteignons le drapeau ... p> Les bytecodes se ressemblent comme suit p> donc, Afaik, c'est le plus proche que vous puissiez atteindre une directive précompile en Java. p> p>