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 :

Pertinence d'une constante String


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Par défaut Pertinence d'une constante String
    Bonjour,

    Je travaille sur du code Java existant, et je m'interroge sur la pertinence de la constante suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public class Constantes {
        public static final String EMPTY_STRING = "";
    }
    Est-ce bien nécessaire, sachant que les String sont "immutables" d'avoir ce genre de constante ? Le compilo ne référence-t'il pas une chaîne unique pour chaque "" trouvé dans le code ?

    Par ailleurs, dans chaque classe utilisant cette constante on trouve:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public class UneClasse {
        private static final String EMPTY_STRING = Constantes.EMPTY_STRING;
    }
    Je ne vois pas l'intérêt, à part marquer juste EMPTY_STRING au lieu de Constantes.EMPTY_STRING ensuite dans le code...

    Ce genre de schéma est reproduit pour toute une série de constantes chaînes. Le caractère immutable des String et le qualificateur "final" ne provoquent-ils pas une recopie de la chaîne dans chaque classe ?

    Merci pour votre avis.

    Philippe.

  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,

    Citation Envoyé par renardbleu Voir le message
    Est-ce bien nécessaire, sachant que les String sont "immutables" d'avoir ce genre de constante ? Le compilo ne référence-t'il pas une chaîne unique pour chaque "" trouvé dans le code ?
    Oui le compilateur génèrera bien une constante dans les deux cas, donc les deux solutions sont identiques.

    La différence étant que la constante peut facilement être changé sans avoir à faire de multiples remplacements dans tous le code, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        public static final String EMPTY_STRING = "(vide)";
    Mais attention comme les constantes sont recopiées dans les classes Java, on doit recompiler toutes les classes qui utilisent cette constante pour que le changement soit bien pris en compte




    Citation Envoyé par renardbleu Voir le message
    Je ne vois pas l'intérêt, à part marquer juste EMPTY_STRING au lieu de Constantes.EMPTY_STRING ensuite dans le code...
    Je pense que c'est bien ce qui a été recherché (utiliser EMPTY_STRING plus facilement ).

    Si tu es sous Java 5 tu pourrais remplacer cela par un import static :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import static com.pack.Constantes.EMPTY_STRING
    a++

  3. #3
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Cela dépend si on cherche à trouver une chaîne vraiment vide, ou si on cherche une expression qui indique, par convention, quelque chose de vide ("(vide)"), comme le dit adiGuba.

    Dans le premier cas l'intérêt est faible, je trouve, particulièrement depuis qu'il y a le isEmpty. il est tout de même plus facile d'écrire "" que EMPTY_STRING (j'ai compris qu'un EDI pouvait le faire automatiquement...), et j'ai pas l'impression qu'on puisse se tromper beaucoup.

    Dans le second cas c'est un peu maladroit, car on peut confondre une valeur vide, avec un marqueur pour le vide.

    Bref je trouve pas ça très astucieux.

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Ou alors de façon encore plus propre tu utilises les commons lang d'apache avec la classe StringUtils et sa méthode isBlank (qui gère les tois cas que tu cites, null, cide, contenant des espaces).

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Par défaut
    Ca pourrait etre en effet une solution, la contre-partie etant que ca imposerait l'utilisation d'un jar en plus.

    ---
    Farid

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Par défaut
    Merci pour tous ces éclaircissements !
    Je vais pouvoir rendre le code un peu plus "propre"...

    (J'avais oublié de préciser que l'on est en java 1.4)

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Par défaut
    Salut,

    Quelques remarques:

    Citation Envoyé par renardbleu Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public class Constantes {
        public static final String EMPTY_STRING = "";
    }
    A part des particuliers, les classes constantes sont generalement implementées sous forme d'interfaces:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface IConstantes {
        public static final String EMPTY_STRING = "";
    }
    Concernant la duplication de EMPTY_STRING dans plusieurs classes j'avoue ne pas en voir l'interet.
    EMPTY_STRING etant definie comme un public static final dans une class/interface utilitaires autant l'utilisé tel quel sans avoir a en avoir une copie locale.

    Concernant maintenant la validite de EMPTY_STRING:
    Je vois de temps en temps certain developper definir des constants de "chaine vide" via des constantes comme tu le montres, et j'avoue que c'est toujours surprenant.
    Prenons l'exemple d'une lecture d'un string dans une DB:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String str=ResultSet.getString("MACOLONNE");
    Imaginons les resultats suivants:
    1. str="toto";
    2. str=" ";
    3. str="";
    4. str=null;

    A part pour le premier cas, est ce que les 3 autres ne peuvent pas (ou ne doivent pas) etre considere comme des chaines vides ?
    If faut donc faire attention a l'implementation de EMPTY_STRING suivant le context d'utilisation et la definition que l'on donne a "une chaine vide".

    Personnellement je prefere utiliser une class utilitaire comme suit pour ce cas precis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public final class StringTools
      {
       ...
       static public boolean isEmpty(String str)
          {
          return (str == null || str.trim().length() == 0);
          }
       ...
       }
    ---
    Farid

Discussions similaires

  1. Interpréter une variable string comme constante
    Par _jerem dans le forum Langage
    Réponses: 4
    Dernier message: 06/06/2008, 01h05
  2. probléme avec une date/string dans un CommandText
    Par critok dans le forum Bases de données
    Réponses: 5
    Dernier message: 09/02/2005, 15h30
  3. ajout d'une constante dans un select
    Par Shabata dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/07/2004, 18h24
  4. Réponses: 6
    Dernier message: 14/02/2004, 14h01
  5. Partage d'une constante entre 2 fichiers en C
    Par elsargento dans le forum C
    Réponses: 6
    Dernier message: 29/09/2003, 22h17

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