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 :

Constante et switch ?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 162
    Par défaut Constante et switch ?
    Bonjour, j'ai un petit problème avec un switch,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    final static byte cst1 = Byte.valueOf(Propertie.getProperty("cst1"));
    final static byte cst2 = Byte.valueOf(Propertie.getProperty("cst2"));
     
    switch (i)
                             {
                               case (cst1): ...;break;
                               case (cst2): ...;break;
    .....
                  }
    Le switch requiert que dans le case la variable soit une constante... je lui met donc "final static byte cst1..." mais le pb c'est que ça me dit que je n'ais pas le droit de modifier une constante alors que je ne donne de valeur a cst1 qu'une seule fois (Byte.valueOf(frame.getProperty("cst1")))

    Avez vous une méthode pour déclarer la variable comme statique et pour lui donner la valeure récupérée dans le fichier properties ?


    Merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 909
    Billets dans le blog
    54
    Par défaut
    Je ne vois pas ou est l'erreur dans ce que tu as ecris mise a part qu'en general on ecris les noms des constantes entierement en majuscule. Tout devrait marcher correctement.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre Expert
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Par défaut
    Hello,


    Est ce que le fait d'affecter dynamiquement ta constante ne lui pose pas de problème. Je crois, mais je ne suis pas sur, les constantes sont fixées à la compilation, cad remplacée dans le code .. Dans ton cas, la constante sera fixée uniquement à l'exécution.

    Est ce que tu as essayé de remplacer l'accès à ton fichier de propriété par la valeur correspondante?

  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
    Salut,

    Citation Envoyé par fabszn
    Est ce que le fait d'affecter dynamiquement ta constante ne lui pose pas de problème. Je crois, mais je ne suis pas sur, les constantes sont fixées à la compilation, cad remplacée dans le code .. Dans ton cas, la constante sera fixée uniquement à l'exécution.
    +1

    Une "constante" doit respecter les règles suivantes :
    • Elle doit avoir les attributs static final.
    • Elle doit être de type primitif ou du type java.lang.String.
    • Elle doit être directement initialisé en ligne et évaluable par le compilateur (pas d'appel de méthode ou de constructeur, ni d'évaluation d'attributs non constante).


    Si une de ces conditions n'est pas respectées, il ne s'agit pas d'une constante mais d'un attribut static. Et la différence est importante car à la compilation, les constantes sont directement remplacées par le compilateur (il n'y a plus aucun lien avec la classe qui les déclares), alors que pour les attributs static provoqueront une évaluation de l'attribut.


    On peut voir cela très facilement, par exemple avec cette classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class Cst {
    	final static byte BYTE1 = 1;			// CONSTANTE
    	final static byte BYTE2 = Byte.valueOf("2");	// ATTRIBUT STATIC
    	final static byte BYTE3 = calculByte3();	// ATTRIBUT STATIC
    	private static byte calculByte3() {
    		return 3;
    	}
     
    	final static byte BYTE4;			// ATTRIBUT STATIC
    	static {
    		BYTE4 = 4;
    	}
     
    	final static String STRING1 = "String" + BYTE1;	// CONSTANTE
    	final static String STRING2 = new String("String2");	// ATTRIBUT STATIC
    	final static String STRING3 = STRING1;		// CONSTANTE
     
    	final static Object OBJECT1 = STRING1;		// ATTRIBUT STATIC
    }
    Et la classe test suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Main {
    	public static void  main(String[] args) {
    		System.out.println("BYTE1   = " + Cst.BYTE1);
    		System.out.println("BYTE2   = " + Cst.BYTE2);
    		System.out.println("BYTE3   = " + Cst.BYTE3);
    		System.out.println("BYTE4   = " + Cst.BYTE4);
    		System.out.println("STRING1 = " + Cst.STRING1);
    		System.out.println("STRING2 = " + Cst.STRING2);
    		System.out.println("STRING3 = " + Cst.STRING3);
    		System.out.println("OBJECT1 = " + Cst.OBJECT1);
    	}
    }
    Lorsqu'on exécute cette classe on obtient logiquement ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    BYTE1   = 1
    BYTE2   = 2
    BYTE3   = 3
    BYTE4   = 4
    STRING1 = String1
    STRING2 = String2
    STRING3 = String1
    OBJECT1 = String1
    Maintenant si on modifie les valeurs de tous les attributs de la classe Cst et que l'on recompile seulement cette classe, on s'apercoit que la modification n'est pas prise en compte pour les constantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    BYTE1   = 1
    BYTE2   = 20
    BYTE3   = 30
    BYTE4   = 40
    STRING1 = String1
    STRING2 = _String2
    STRING3 = String1
    OBJECT1 = _String10
    Nota : Il faut bien sûr compiler à la main avec javac car les EDI devraient recompiler automatiquement la classe Main...


    Pour en revenir à ton problème, le switch nécessite des constantes pour les différents "case" car le compilateur utilise ses valeurs pour générer une table de hashage permettant d'optimiser le traitement...

    Bref tu ne peux pas utiliser le switch pour cela (il faudrait savoir ce que tu veux faire précisément pour trouver une alternative)

    a++

  5. #5
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 162
    Par défaut
    Merci adiGuba pour cette excellente explication !

    J'ais remplacé le switch par des if+continu cela devrait faire l'affaire, c'est moins performant que le switch mais je pense que c'est suffisament rapide tout de même.

    Je donne le code pour ceux qui aimerait voir ce que je voulais faire :

    dites moi si je peux l'optimiser, le but de ce bout de code est de remettre les colonnes de ma jxtable dans le meme ordre qu'il été a la dernière utilisation du programme !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
     
    				//Je récupère les index enregistrer a la dernière fermeture du programme
                    byte C0 = Byte.valueOf(frame.getProperty("column_0.index")) ,
                    C1 = Byte.valueOf(frame.getProperty("column_1.index")),
                    C2 = Byte.valueOf(frame.getProperty("column_2.index")),
                    C3 = Byte.valueOf(frame.getProperty("column_3.index")),
                    C4 = Byte.valueOf(frame.getProperty("column_4.index"));
     
     
    				//je déclare les variable des position actuelle des colonnes dans la jtable
                    int C02,
                    C12,
                    C22,
                    C32,
                    C42;                               
     
     
    				//je fais un boucle pour remettre les colonnes dans l'ordre choisis au dernier lancement du programme
    				byte i=0;		
    				for(i = 0; i < 5 ; i++)
    				{
    		            if(C0==i){C02 = majxtable.convertColumnIndexToView(0);if(C02!=i){majxtable.moveColumn(C02,i);};continue;}
    		            if(C1==i){C12 = majxtable.convertColumnIndexToView(1);if(C12!=i){majxtable.moveColumn(C12,i);};continue;}
    		            if(C2==i){C22 = majxtable.convertColumnIndexToView(2);if(C22!=i){majxtable.moveColumn(C22,i);};continue;}
    		            if(C3==i){C32 = majxtable.convertColumnIndexToView(3);if(C32!=i){majxtable.moveColumn(C32,i);};continue;}
    		            if(C4==i){C42 = majxtable.convertColumnIndexToView(4);if(C42!=i){majxtable.moveColumn(C42,i);};continue;}
    		        }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Switch] Et les constantes
    Par BiM dans le forum Langage
    Réponses: 9
    Dernier message: 09/04/2008, 14h16
  2. [switch, constante] C2051
    Par ZaaN dans le forum C++
    Réponses: 3
    Dernier message: 16/02/2007, 13h23
  3. Réponses: 6
    Dernier message: 26/01/2003, 13h45
  4. [ADO] Constantes des types de champ
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 05/09/2002, 11h08
  5. Au sujet des constantes
    Par FranT dans le forum Langage
    Réponses: 8
    Dernier message: 09/08/2002, 11h03

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