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

Langage Java Discussion :

Compilation conditionnelle


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de srvremi
    Homme Profil pro
    Directeur d'école d'ingénieurs
    Inscrit en
    Mars 2002
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur d'école d'ingénieurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2002
    Messages : 554
    Par défaut Compilation conditionnelle
    Bonjour tout le monde.

    J'ai écrit une application qui tourne sur toutes les plateformes possédant un JRE (Mac, Linux, Sun, Windows, ...) et tout marche très bien.

    Seulement, je voudrais rajouter une fonctionnalité dans la version Windows uniquement. Comment dois-je faire pour que, dans mon projet (conçu avec l'EDI NetBeans 5.0), je puisse compiler les 2 versions (Windows et autre) sans devoir tout recoder ?

    Merci d'avance.

    @+
    Rémi

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    En Java il n'y a pas de compilation conditionnelle tel qu'elle existe en C ou C++, principalement parce qu'une grande partie de la compilation est effectué à l'exécution du programme (compilation JIT).

    Il te suffit donc d'utiliser des conditions normales (un simple if). Le compilateur (javac ou JIT) supprimera le bout de code correspondant si c'est possible...


    Mais dans ton cas je pense que le Design PAttern Factory est plus approprié.



    1./ Tu décris une interface qui contiendra les fonctionnalités, exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public interface Fonction {
     
    	public void doSomething();
    	public void doAnotherThing();
     
    }
    2./ Tu écris une classe qui implémente cette interface, mais tu la rends accessible au package seulement (non-public) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class WindowsFonction implements Fonction {
     
    	public void doSomething() {
    		// code specifique windows ...
    	}
     
    	public void doAnotherThing() {
    		// code specifique windows ...
    	}
     
    }
    3./ Enfin dans le même package tu crée une classe Factory, qui te permettra d'allouer le bon objet selon le système :
    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 FonctionFactory {
     
     
    	public Fonction createFonction() {
     
    		if ( System.getProperty("os.name").startsWith("Windows") ) {
    			return new WindowsFonction();
    		}
     
    		return null;
    	}
     
    }

    Avantages :
    • C'est plus simple à gérer si demain tu implémentes les mêmes fonctionnalitées pour un autre systèmes (il te suffit d'implémenter l'interface et de modifier la factory).
    • Tu ne crée pas l'objet directement (pas de risque de l'utiliser sous Linux).



    Et au lieu de renvoyer null tu peux même renvoyer une classe "vide" : sur les autres systèmes tu fais quand même les appels mais ils n'aboutissent à rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    final class DummyFonction implements Fonction {
     
    	public void doSomething() {
    	}
     
    	public void doAnotherThing() {
    	}
     
    }
    Généralement ce type de méthode est remplacé par "rien du tout" à l'exécution (pas d'appel de méthode du tout). Tu peux eventuellement forcer la main en mettant la classe final...

    Ceci te permet de ne pas te préoccuper du système sur lequel tu fonctionnes... Bien sûr il ne faut pas que ces fonctionnalitées soit primordiale au bon déroulement de ton programme...


    a++

  3. #3
    Membre chevronné Avatar de srvremi
    Homme Profil pro
    Directeur d'école d'ingénieurs
    Inscrit en
    Mars 2002
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur d'école d'ingénieurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2002
    Messages : 554
    Par défaut
    Merci beaucoup, ta réponse est très intéressante et très claire. Cela semble correspondre parfaitement à ce que je recherche.

    Une petite précision cependant, la fonctionnalité que je souhaite développer nécessite un paquet assez volumineux. J'aimerais ne pas l'inclure dans les distributions autres que Windows. Seulement je ne sais pas faire, si je ne fais pas l'inclusion, le programme plante au démarrage. Comment dois-je faire pour éviter cette erreur ?

    Merci encore pour ta superbe réponse parfaitement claire.

    @+
    Rémi

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par srvremi
    Une petite précision cependant, la fonctionnalité que je souhaite développer nécessite un paquet assez volumineux. J'aimerais ne pas l'inclure dans les distributions autres que Windows.
    Tu peux la distribuer sous forme d'un Jar supplémentaire...

    Citation Envoyé par srvremi
    Seulement je ne sais pas faire, si je ne fais pas l'inclusion, le programme plante au démarrage. Comment dois-je faire pour éviter cette erreur ?
    C'est à dire ? Tu ne devrait pas inclure directement les classes spécifique au système mais utiliser l'interface qui est implémenté...

    a++

    [edit] : c'est quel type de fonctionnalité que tu veux ajouter ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 118
    Par défaut
    juste une petite uestion : tu fais comment ça :

    Citation Envoyé par adiGuba
    mais tu la rends accessible au package seulement (non-public)
    ??

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par alex'l
    juste une petite uestion : tu fais comment ça :

    Citation Envoyé par adiGuba
    mais tu la rends accessible au package seulement (non-public)
    ??
    Tu enlève le public devant la déclaration de la classe, comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class WindowsFonction implements Fonction {
         ...
    }
    Et la classe WindowsFonction ne pourra être instancié que depuis une classe du même package... Par contre comme elle implémente une interface publique tu pourra l'utiliser depuis n'importe quelle classe...


    Il est bien sûr possible de faire la même chose avec les méthodes afin qu'elle ne soient utilisable que par les classes du même package...

    a++

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 118
    Par défaut
    a ok, je ne savais pas... je pensai que ne rien mettre était équivalent à "public"...
    Merci.

  8. #8
    Membre chevronné Avatar de srvremi
    Homme Profil pro
    Directeur d'école d'ingénieurs
    Inscrit en
    Mars 2002
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur d'école d'ingénieurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2002
    Messages : 554
    Par défaut
    tu peux la distribuer sous forme d'un Jar supplémentaire...
    Je sais pas comment faire ça sans que ça plante, tu peux m'expliquer ?

    @+
    Rémi

  9. #9
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Qu'est-ce qui plante exactement ?

    a++

  10. #10
    Membre chevronné Avatar de srvremi
    Homme Profil pro
    Directeur d'école d'ingénieurs
    Inscrit en
    Mars 2002
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur d'école d'ingénieurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2002
    Messages : 554
    Par défaut
    Ben il me dit "classe truc bidule" introuvable.

  11. #11
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par srvremi
    Ben il me dit "classe truc bidule" introuvable.
    A la compilation ou à l'exécution ?

    A la compilation c'est normal que tu ais besoin de toutes les classes.

    A l'exécution tu ne devrait pas avoir ce problème si tu gère bien les différents systèmes...

    a++

Discussions similaires

  1. problème compilation conditionnelle
    Par salseropom dans le forum Linux
    Réponses: 5
    Dernier message: 16/10/2007, 16h08
  2. Compilation conditionnelle
    Par owsion dans le forum Langage
    Réponses: 6
    Dernier message: 25/10/2005, 17h15
  3. [LG] Compilation conditionnelle et multiples unités
    Par Alcatîz dans le forum Langage
    Réponses: 4
    Dernier message: 05/06/2005, 08h58
  4. syntaxe pour compilation conditionnelle ?
    Par tintin72 dans le forum C
    Réponses: 9
    Dernier message: 17/05/2005, 18h12
  5. [CODE] Compilation conditionnelle ?
    Par Cornell dans le forum Langage
    Réponses: 3
    Dernier message: 16/09/2003, 18h16

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