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

avec Java Discussion :

Différence d'utilisation entre parseXxx, valueOf et decode ?


Sujet :

avec Java

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Différence d'utilisation entre parseXxx, valueOf et decode ?
    Bonjour à tous,

    je butte sur une question sans doute simple. J'ai consulté la doc de l'API concernant les méthodes parseXxx, decode et valueOf des classes enveloppes pour les types entiers. Je comprends qu'il y a une différence (signature, manière d'opérer) entre ces méthodes (surtout decode qui renvoie un type primitif alors que les deux autres renvoient un objet de la classe enveloppe) mais je ne vois pas dans quel cas leur usage sera préféré ! Particulièrement entre parseXxx et valueOf.

    Un petit de bout de code qui teste les différentes formulations qui aboutissent aux mêmes résultats affichage et aux mêmes résultats objet pour parseXxx et valueOf.

    Je prends tous les avis concernant le bon usage de ces méthodes !

    Merci .

    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
     
    package TestsNombres;
     
    public class Conversions {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
     
    		byte b = Byte.parseByte("123");
    		Byte B1 = Byte.decode("123");
    		Byte B2 = Byte.valueOf("123");
     
    		System.out.println(b);
    		System.out.println(B1);
    		System.out.println(B2);
     
    		long l = Long.parseLong("123");
    		Long L1 = Long.decode("123");
    		Long L2 = Long.valueOf("123");
     
    		System.out.println(l);
    		System.out.println(L1);
    		System.out.println(L2);
    	}
     
    }

  2. #2
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    parseXxx renvoie une valeur du type primitif alors que valueOf renvoie une valeur du type enveloppe.

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 554
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 612
    Points
    21 612
    Par défaut
    Concernant, decode(), il suffit de lire sa JavaDoc pour comprendre la différence :

    Cette méthode auto-détecte si l'entier à lire est en décimal, hexadécimal ou octal. Autrement dit, les nombres qui commencent par zéro seront lus en octal. Ceux qui comment par 0x ou par # ne lèveront pas d'exception à cause de ça, mais seront lus en hexadécimal.
    Ce n'est pas le cas de parseInt() et valueOf(), qui parsent toujours en décimal.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Concernant, decode(), il suffit de lire sa JavaDoc pour comprendre la différence :

    Cette méthode auto-détecte si l'entier à lire est en décimal, hexadécimal ou octal. Autrement dit, les nombres qui commencent par zéro seront lus en octal. Ceux qui comment par 0x ou par # ne lèveront pas d'exception à cause de ça, mais seront lus en hexadécimal.
    Ce n'est pas le cas de parseInt() et valueOf(), qui parsent toujours en décimal.
    La doc de l'API ne suffit pas pour moi à faire la différence car parseXxx et valueOf ont deux formes dont une où l'on précise la base dans laquelle on veut "parser" la chaîne passée en argument... Elles ne parsent donc pas toujours en décimal.

    Merci pour la première réponse, effectivement dans mon exemple je mettais cela en avant à savoir que la seule différence est que decode et valueOf renvoient des types enveloppes tandis que parseXxx renvoie un type primitif.

    Je vais préciser à nouveau ma question : dans quelle circonstance faites-vous le choix de l'une des trois ? Performance ? Usage ? (et si c'est un type de retour enveloppe qui est désiré, quel critère de choix avez-vous entre decode et valueOf ?)

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 554
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 612
    Points
    21 612
    Par défaut
    Citation Envoyé par fonnet Voir le message
    La doc de l'API ne suffit pas pour moi à faire la différence car parseXxx et valueOf ont deux formes dont une où l'on précise la base dans laquelle on veut "parser" la chaîne passée en argument... Elles ne parsent donc pas toujours en décimal.
    La doc est claire sur le fait que parseXxx() et valueOf() parsent dans la base demandée si une base est demandée, et en base 10 sinon.
    Et que decode() ne permet pas de spécifier une base, cette base étant auto-détectée à partir de la chaîne à parser et plus précisément en fonction de la présence d'un préfixe indicateur et lequel. C'est vrai que c'est un peu compliqué à écrire, mais pas à comprendre.

    Performance ? Usage ? (et si c'est un type de retour enveloppe qui est désiré, quel critère de choix avez-vous entre decode et valueOf ?)
    Si je dois choisir entre valueOf() et parseXxx(), personnellement je considère qu'il y a peu de différence, et que la méthode parseXxx() est plus claire, puisqu'elle se nomme parse. Avec une exception : si je dois parser beaucoup et que j'ai besoin du résultat dans une classe enveloppe, les performances ont des chances d'être meilleures avec valueOf().

    Pour décider entre parseXxx() et decode(), les deux méthodes ne font simplement pas la même chose. ParseXxx() parse dans la base qu'on lui demande, et decode() décide de la base en fonction de ce qu'on lui demande de parser. À mon sens, une méthode ne devrait pas changer d'effet en fonction de son entrée, sauf s'il s'agit d'un protocole préétabli.
    Autrement dit, ne jamais utiliser decode(), sauf si on veut parser une String en nombre en autodétectant sa base, la base 16 si ça commence par 0X ou #, la base 8 si ça commence par 0, et la base 10 sinon.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour cette réponse détaillée !

    Je ne ferme pas le sujet en "résolu", je suis preneur d'autres avis/expériences à l'utilisation.

  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,


    Au niveau de la convertion String => int parseInt() et valueOf() sont équivalente puisqu'elles appellent toutes les deux la même méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        public static Integer valueOf(String s) throws NumberFormatException {
            return Integer.valueOf(parseInt(s, 10));
        }
     
        public static int parseInt(String s) throws NumberFormatException {
            return parseInt(s,10);
        }
    La seule différence se fait donc sur le type de retour (int ou Integer) et il n'y a pas vraiment de question à se poser : on utilisera celle adapté au type que l'on souhaite obtenir...

    A noter que valueOf() utilise un cache pour certaines valeurs (au moins pour les valeurs entre -128 et 127).

    Citation Envoyé par thelvin Voir le message
    À mon sens, une méthode ne devrait pas changer d'effet en fonction de son entrée, sauf s'il s'agit d'un protocole préétabli.
    Autrement dit, ne jamais utiliser decode(), sauf si on veut parser une String en nombre en autodétectant sa base, la base 16 si ça commence par 0X ou #, la base 8 si ça commence par 0, et la base 10 sinon.
    decode() ne change pas vraiment d'effet. Elle fonctionne différemment c'est tout. Elle permet de decoder un chiffre d'une manière similaire aux langages de programmation, qui permettent de spécifier facilement la base utilisé.

    Bien sûr ce n'est pas trop adapté à une saisie utilisateur, mais dans un fichier de config ou autre c'est nettement plus pratique car cela laisse le choix de la saisie...


    a++

Discussions similaires

  1. Différence(s) JDK entre IBM et Sun ?
    Par g_rare dans le forum Langage
    Réponses: 9
    Dernier message: 05/05/2006, 12h16
  2. API qui donne la différence des données entre 2 classes ?
    Par elitost dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 18/04/2006, 11h07
  3. Réponses: 6
    Dernier message: 06/12/2005, 16h51
  4. [Rave] Différence de langue entre exécution et design
    Par RamDevTeam dans le forum Composants VCL
    Réponses: 2
    Dernier message: 29/11/2005, 11h49
  5. Différences d'affichage entre IE et FF
    Par Tot-O dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 22/09/2005, 18h47

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