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 :

récupérer le nom d'un champ static par sa valeur


Sujet :

Langage Java

  1. #1
    Membre actif Avatar de djidane39
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 272
    Points : 250
    Points
    250
    Par défaut récupérer le nom d'un champ static par sa valeur
    Voilà mon problème:
    J'ai une classe State avec plusieurs champs static
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /** disconnected state */
    	public static final int DISCONNECTED = 0;
     
    	/** waiting connection confirmation state */
    	public static final int WAITING_CONNECTION_CONFIRMATION = 1;
     
    	/** connected with local list state */
    	public static final int CONNECTED_LOCAL_LIST = 2;
     
    	/** connected state */
    	public static final int CONNECTED = 3;
     
    	/** select a file to download state */
    	public static final int P2P_SELECTED = 4;
    J'aimerai afficher un de ces champs non pas avec la valeur de l'entier, mais avec le nom du champs qui correspond à une valeur donnée. par exemple si je donne la valeur int state = 3, j'aimerais qu'il me retourne la chaine "CONNECTED". Voici l'entete de ma fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static String getStringState(int state)
    Je pense qu'il faut utiliser l'introspection ou la reflexivité, en regardant les tuto et la faq, c'est ce qui s'en rapproche le plus. Cependant je n'ai pas trouvé comment faire -_-'

  2. #2
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    bonjour
    sinon tu peux faire ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public static String getStringState(int state){
        return (state==CONNECTED?"CONNECTED":" ";
    }
    mais vu que CONNECTED soit un nom de variable mais une constante ........................

  3. #3
    Membre actif Avatar de djidane39
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 272
    Points : 250
    Points
    250
    Par défaut
    oui je peu faire comme ça, mais vu que mes etat vont peu être changer, je voulais ne pas avoir à tout changer mon Switch case -_-'
    il me faudrait un truc du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String res = getNomDuChampsStaticQuiALaValeur(int state)

  4. #4
    Membre actif Avatar de djidane39
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 272
    Points : 250
    Points
    250
    Par défaut
    en fait voilà ma solution actuelle, version "little player" qui n'est pas évolutif:
    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
    public static String getStringState(int state) {
    		String stringState = "";
    		switch (state) {
    			case DISCONNECTED:
    				stringState = "DISCONNECTED";
    			case WAITING_CONNECTION_CONFIRMATION:
    				stringState = "WAITING_CONNECTION_CONFIRMATION";
    			case CONNECTED_LOCAL_LIST:
    				stringState = "CONNECTED_LOCAL_LIST";
    			case CONNECTED:
    				stringState = "CONNECTED";
    			case P2P_SELECTED:
    				stringState = "P2P_SELECTED";
    			case DOWNLOADING:
    				stringState = "DOWNLOADING";
    			case PDF_SELECTED:
    				stringState = "PDF_SELECTED";
    			case VIEWING:
    				stringState = "VIEWING";
    			case WAITING_DISCONNECTION_CONFIRMATION:
    				stringState = "WAITING_DISCONNECTION_CONFIRMATION";
    		}
     
    		return stringState;
    	}
    il me faudrait quelquechose de vraiment indépendant vis-à-vis des nom de constante qui risque de changer

  5. #5
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    Dans un cadre evolutif ou de mise à jour tu pourrais aussi creer un tableau dynamique pour stocker les etats ou un fichier pour les stoker

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 867
    Points : 22 921
    Points
    22 921
    Billets dans le blog
    52
    Par défaut
    Note : il manque des break; dans ton switch.

    Suivant la version que tu as de Java, ce sera beaucoup plus pratique de faire ca avec des enum :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    enum State {
    DISCONNECTED, WAITING_CONNECTION_CONFIRMATION, WAITING_CONNECTION_CONFIRMATION, CONNECTED_LOCAL_LIST, CONNECTED_LOCAL_LIST, CONNECTED, P2P_SELECTED, DOWNLOADING, PDF_SELECTED, VIEWING, WAITING_DISCONNECTION_CONFIRMATION;
    }
    Puisque la method toString() de l'enum retourne directement la chaine correspondante au nom de la variable/valeur, qu'on peut retrouver un entier via la methode ordinal() et que ca marche directement dans un switch.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    State state = ...
     
    String stringState = state.toString();
     
    switch (state) {
      case DISCONNECTED :
         [...]
      break;
      case WAITING_CONNECTION_CONFIRMATION:
         [...]
      break;
      [...]
    }
    Sinon pour decoupler completement le texte a afficher de la valeur il suffit de mettre tout ca dans un fichier de ressources ; par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ResourceBundle bundle = ResourceBundle.getBundle("Labels");
    String stringState = bundle.getString("LABEL_STATE_"+state);
    // Ou qq chose du genre :
    String stringState = bundle.getString("LABEL_STATE_"+state.ordinal());
    Ca peut aussi marche avec tes entiers. Ou tu peux mettre les chaines a afficher dans une Map initialisee statiquement (ou pas) (la aussi ca marche avec tes entiers de maniere similaire), ajouter une methode a l'enum, surcharger toString(), etc... Bref, il y a plein de solutions...

  7. #7
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Les enum de Java 5 serait bien entendu la meilleure solution


    Sinon on pourrait se baser sur les Jakarta Commons Lang qui propose un Design Pattern pour cela via la classe org.apache.commons.lang.enums.Enum...


    Ou bien on peut directement utiliser une classe spéciale, par exemple :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    // Classe finale pour qu'elle ne soit pas étendu
    public final class State {
     
    	// Attributs des valeurs de l'énums (nom + valeur)
    	private final String name;
    	private final int value;
     
    	// Constructeur privé (pour interdire la création de nouvelle instance)
    	private State(String name, int value) {
    		this.name = name;
    		this.value = value;
    	}
     
     
    	public String name() {
    		return this.name;
    	}
     
    	public int value() {
    		return this.value;
    	}
     
     
    	/** disconnected state */
    	public static final State DISCONNECTED = new State("DISCONNECTED", 0);
     
    	/** waiting connection confirmation state */
    	public static final State WAITING_CONNECTION_CONFIRMATION = new State("WAITING_CONNECTION_CONFIRMATION", 1);
     
    	/** connected with local list state */
    	public static final State CONNECTED_LOCAL_LIST  = new State("CONNECTED_LOCAL_LIST", 2);
     
    	/** connected state */
    	public static final State CONNECTED  = new State("CONNECTED", 3);
     
    	/** select a file to download state */
    	public static final State P2P_SELECTED  = new State("P2P_SELECTED", 4);
    }
    Le problème principale vient du fait que les switch() ne sont plus possible


    a++

    PS : a noter également qu'en cas de sérialisation il faut rajouter en plus des traitements particulier pour gérer l'unicité des valeurs...

  8. #8
    Membre actif Avatar de djidane39
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 272
    Points : 250
    Points
    250
    Par défaut
    bon, ben j'ai plus qu'à choisir ^_^
    en tout cas merci à vous tous!
    Question bonus: je crois que en 1.6 les switch sur les enum ça passe???
    sinon je crois que je vais choisir les enum, qui me paraisse le plus simple, le moins lourd et le plus efficace. Par contre pour la sérialisation en effet ça risque de me poser un problème.... Je vais étudié ça

  9. #9
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par djidane39 Voir le message
    Question bonus: je crois que en 1.6 les switch sur les enum ça passe???
    Oui ! Les switch passe sur les enums même en 1.5... C'est juste sur les classes persos que cela ne marche pas...


    Citation Envoyé par djidane39 Voir le message
    sinon je crois que je vais choisir les enum, qui me paraisse le plus simple, le moins lourd et le plus efficace. Par contre pour la sérialisation en effet ça risque de me poser un problème.... Je vais étudié ça
    Si tu es en Java > 1.5 alors il n'y a pas à réfléchir trop longtemps, les enums sont fait pour cela et gère très bien tout ceci... y compris la sérialisation !

    a++

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

Discussions similaires

  1. Récupérer le nom d'un champ d'une table
    Par doubiste_59 dans le forum Requêtes
    Réponses: 3
    Dernier message: 29/07/2010, 11h32
  2. [AC-2007] Récupérer le nom d'un champ dans une requête SQL
    Par othke dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 09/03/2010, 18h48
  3. Réponses: 19
    Dernier message: 05/11/2007, 12h11
  4. Comment récupérer le nom d'un champ ?
    Par langela94 dans le forum SQL
    Réponses: 2
    Dernier message: 07/06/2007, 16h23
  5. Récupérer le nom d'un champ pour utilisation dans getElement
    Par effree dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/02/2006, 16h21

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