IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Equivalent des préprocesseurs du C en Java


Sujet :

Java

  1. #1
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut Equivalent des préprocesseurs du C en Java
    Bonjour,
    Une simple question, j'aimerai savoir s'il est possible de faire l'équivalent de ce code en Java:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef DEBUG
       ...
    #else
       ...
    #endif
    en gros, que selon une configuration de compilation, un bout de code change?
    Dois-je forcément gérer ça avec des simples constantes, ou il y a t'il un moyen plus propre?

  2. #2
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    Bonjour,

    il n'y a pas a ma connaissance de précompilateur ou de compilation conditionnelle en JAVA.
    Une astuce consiste a utiliser des classes statiques permettant d'accéder à des constantes publiques.
    Vous pouvez éventuellement initialiser ces valeurs par un fichier de configuration, ou prendre des arguments depuis une ligne de commande.
    Jetez aussi un coup d'oeil à la classe Properties: http://download.oracle.com/javase/6/...roperties.html, ainsi que la classe Preferences: http://download.oracle.com/javase/6/...eferences.html

    @ bientôt...

  3. #3
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 084
    Points
    7 084
    Par défaut
    Normalement si tu déclares une champ "private static final <type de base>" et que tu encapsules tes morceaux de code dans un "if" qui teste l'égalité de champ, le compilateur devrait optimiser et ne pas inclure le morceaux de code qui correspond au cas compilé ...

    En pratique
    Le code source original
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class FooBar
    {
      private static final boolean DEBUG = false;
      public static void main(String[] args)
      {
        if (DEBUG)
        {
           System.out.println("Debugging FooBar");
        }
        System.out.println("Hello World !");
      }
    }
    Ne devrait subsister dans ton bytecode uniquement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class FooBar
    {
      private static final boolean DEBUG = false;
      public static void main(String[] args)
      {
        System.out.println("Hello World !");
      }
    }
    A vérifier.

    Si vraiment tu ne veux pas que des morceaux codes apparaissent dans le produit "final", le mieux doit être l'AOP.

  4. #4
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut
    Merci à tous pour vos réponses.
    Je pense que le plus simple reste les constantes statiques; la seule idée que je pensais au départ; je cherchais juste à savoir si il y avait un moyen plus propre (à partir d'une configuration lors de la compilation).

    L'idée de l'utilisation des classes 'Properties' ou 'Preferences' n'est pas du tout approprié, car ici ça concerne des propriétés pour l'utilisateur.

  5. #5
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 084
    Points
    7 084
    Par défaut
    Si tu utilises un script (ex: Ant) pour compiler, tu peux "activer" le mode DEBUG en utilisant du remplacement de chaîne ou l'AOP.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    Je ne vois pas comment on peut utiliser l'AOP dans ce genre de problématique!
    Il n'y a pas de préprocessor en java c'est sûr
    On ne peut pas modéliser un aspect générique sur un morceau de code qui se trouve au milieu du code!

  7. #7
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 084
    Points
    7 084
    Par défaut
    Qui a dit qu'on devait développer un aspect générique ?
    Ni qu'on pouvait facilement insérer un aspect au beau milieu du code ...

    En revanche, je pense que c'est la façon la plus simple d'injecter du code au milieu d'un code.

  8. #8
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 571
    Points : 15 538
    Points
    15 538
    Par défaut
    Il n'y a en effet pas de préprocesseur en Java, On peut souvent se débrouiller comme expliqué par rtg57 et Nemek ou moyen de constantes qui permettent au compilateur de déterminer des bloc qu'ils peut supprimer.

    J'ai bossé sur des projets J2ME où on utilisait des préprocesseurs maison ou même le préprocesseur de GCC. C'est faisable mais très moche et je ne le conseille absolument pas.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    Citation Envoyé par Nemek Voir le message
    Qui a dit qu'on devait développer un aspect générique ?
    Ni qu'on pouvait facilement insérer un aspect au beau milieu du code ...

    En revanche, je pense que c'est la façon la plus simple d'injecter du code au milieu d'un code.
    Ce n'est pas faisable avec l'AOP ni avec un script ant avec une tasklet standard.
    Peut être l'utilisation d'une xdoclet (des javadoc spéciales) qui supprime les lignes se trouvant au milieu avant compilation (genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /** 
     * @DEBUG-BEGIN 
     */
    //code visible en mode debug...  
    /** 
     * @DEBUG-END 
     */
    )
    Où peut être avec les annotations plus tard car d'après mes connaissances les annotations sur les variables ne sont pas récupérable après en bytecode!

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    rappelons qu'une des raisons de l'absence de préprocesseur en java, c'est justement l'impossibilité pour un ide, par exemple, d'arriver à faire correctement de l'analyse sur des bout de code non prédictibles. Y a qu'à voir la difficulté de faire de l'autocompletion correcte en C


    Pour désactiver le code, il y a les constantes. Pour des trucs plus avancé, il y a les plugins du compilateur, mais ça casse tout dans l'ide si tu ne t'intègre pas aussi à l'IDE.

    A noter que, comme précisé, le code qui ne s'exécutera jamais (constante finale à false) peut être abandonné par le compilateur (c'est autorisé par la JLS)

  11. #11
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 084
    Points
    7 084
    Par défaut
    Citation Envoyé par hibour Voir le message
    Ce n'est pas faisable avec l'AOP
    Tu peux à condition:
    1. De connaître la méthode à modifier (c'est facile puisque c'est là que tu veux insérer le code !)
    2. D'identifier un appel à une méthode avant et/ou après et/ou à la place de laquelle tu vas insérer le code de DEBUG. Le plus simple étant de créer une classe "com.developpez.zoubi.Debug" avec une méthode "public static void debug();" pour identifier un pointcut. Il ne reste plus qu'à écrire l'advice "around".

    Il y a après la possibilité d'écrire une bibliothèque basée sur BCEL qui modifie le bytecode (comme le fait AspectJ) afin d'insérer "stratégiquement" des instructions.

    Citation Envoyé par hibour Voir le message
    ni avec un script ant avec une tasklet standard.
    Voir Replace, ReplaceRegExp, Script et Exec.

  12. #12
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut
    Et bien, il y a tant d'idées; mais j'ai l'impression que pour la plupart, on passe plus de temps à mettre en place le système et sa configuration qu'autre chose...

    Je pense que la constante Debug suffit amplement, d'autant plus est, qu’apparemment, Java sait virer le code mort automatiquement.

  13. #13
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 084
    Points
    7 084
    Par défaut
    Forcément puisqu'il faut recoder un pre-processeur

    Si c'est juste pour envoyer des messages sur la console, penses aux logger !

Discussions similaires

  1. Equivalents des Templates de C++ en Java
    Par ToTo13 dans le forum Général Java
    Réponses: 5
    Dernier message: 13/05/2011, 01h35
  2. Equivalent des Java Hashmap en Visual c++
    Par Sallie dans le forum MFC
    Réponses: 10
    Dernier message: 12/05/2006, 10h20
  3. Equivalent des Java Hashmap en c++
    Par Sallie dans le forum C++
    Réponses: 4
    Dernier message: 11/05/2006, 17h58
  4. [C#] Equivalence des API java en C# en ligne
    Par totoranky dans le forum Windows Forms
    Réponses: 6
    Dernier message: 15/02/2005, 01h16
  5. Equivalent des SHOW de MySQL
    Par YanK dans le forum Requêtes
    Réponses: 2
    Dernier message: 08/10/2003, 09h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo