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

Affichage des résultats du sondage: Êtes-vous pour ou contre cette proposition ?

Votants
471. Vous ne pouvez pas participer à ce sondage.
  • Pour

    404 85,77%
  • Contre

    67 14,23%
Langage Java Discussion :

JDK 7: Proposition 4 : possibilité d'utiliser les String dans les switch case -> Intégrée [Débat]


Sujet :

Langage Java

  1. #101
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par kisame Voir le message
    ouais mais là ça reste de la faute de frappe.

    de la même manière (...)

    ça reste aussi porc et dangereux avec un type primitif.
    Oui, bien sur il n'y a pas de solutions miracles, mais c'est plus difficile à repérer dans les chaînes de caractères...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    switch (role) {
    case "guest":  /* ... */
    case "user":  /* ... */
    case "poweruser":  /* ... */
    case "manager":  /* ... */
    case "administator":  /* ... */
    case "noaccess":  /* ... */
    default: /* ... */
    }
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  2. #102
    En attente de confirmation mail

    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 766
    Points : 1 267
    Points
    1 267
    Par défaut
    Citation Envoyé par kisame Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    case 44:    <--- ça passe alors que c'est une faute de frappe.
    Mauvaise fois inside

  3. #103
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 151
    Points : 144
    Points
    144
    Par défaut
    oui totalement.

    Mais pas plus que
    case "administator":
    case "NOz": /* ...*/
    C'est un exemple basé sur une erreur de frappe en réponse à un exemple basé sur une erreur de frappe. Ne me dis pas le contraire

    c'était ce que je voulais montrer (la mauvaise foi) mais c'est pas moi qui l'ai dit

    edit : tiens ... en quoi mon exemple est pire que le sien ?

  4. #104
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par kisame Voir le message
    edit : tiens ... en quoi mon exemple est pire que le sien ?
    En théorie les 2 erreurs de frappes sont équiprobables. Dans la réalité, il est plus courant de se gourer sur une suite de lettres que sur une suite de chiffres.

    Reprend tous les posts de la discussion et compte le nombre de fautes/typos sur des lettres versus des chiffres.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #105
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 151
    Points : 144
    Points
    144
    Par défaut
    non mais je suis bien d'accord
    C'est juste que pour moi, la faute de frappe n'est pas un argument de poids. Pour cette proposition c'est un argument mais à prendre pour ce que c'est. Et oui ça arrive plus souvent de se planter dans une chaine de caractère que dans la saisie d'un chiffre

    Ton exemple venait quand on discutait sur la "propreté" du code. Dans les deux cas ça reste autant dégueu.

    Encore une fois, une constante résout le problème (là je pense qu'il ne peut même pas y avoir débat sur ce point). Mais le problème existe autant pour les types primitifs que pour les string. C'est ce que je voulais dire.

    Je suis pour un utilisation décomplexée des strings

  6. #106
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par kisame Voir le message
    Je suis pour un utilisation décomplexée des strings
    Pour avoir mis les mains dans des appli AJAX, l'utilisation a outrance des chaînes de caractères m'a laissé un goût amer. C'est certe tres rapide et puissant, mais à debuguer/maintenir c'est une horreur.

    Si le switch(String) est possible dans Java 7, j'ajouterai une nouvelle "bonne pratique" dans mon guide de developpement: Ne pas l'utiliser, sauf dans dés cas très simples pour eviter une suite de "if ("XX".equals(s)) {}".
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #107
    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 pseudocode Voir le message
    sauf pour simplifier une suite de "if ("XX".equals(s)) {}".
    Ben... C'est justement l'objectif du switch(String)

    a++

  8. #108
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Ben... C'est justement l'objectif du switch(String)
    Oui, je m'en suis apperçu en l'écrivant.

    Ce que je veux dire c'est de ne pas utiliser le switch(String) comme un design pattern (a la javascript).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // THAT'S BAD
    void persist(String command, Object o) {
      switch(command) {
        case "create": /* ... */
        case "update": /* ... */
        case "delete": /* ... */
      }
    }
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  9. #109
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 151
    Points : 144
    Points
    144
    Par défaut
    Je suis pour un utilisation décomplexée des strings
    heu ... c'était plus une phrase à double sens

    et puis ça veut dire ne pas avoir peur des les utiliser quand c'est fait de manière intelligente. Ca ne veut pas dire faire nimp

  10. #110
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 936
    Points : 4 356
    Points
    4 356
    Par défaut
    contre

    l'égalité stricte de String est une problématique trop subtile pour baser une construction controlant le flux d'exécution de programmes là-dessus…

  11. #111
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    l'égalité stricte de String est une problématique trop subtile pour baser une construction controlant le flux d'exécution de programmes là-dessus…
    Ce serait au compilateur de gérer ça correctement de toute façon en faisant un appel "mastring".equals(var) plutôt qu'un ==, ça doit pas être bien compliqué.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  12. #112
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 936
    Points : 4 356
    Points
    4 356
    Par défaut
    Citation Envoyé par natha Voir le message
    Ce serait au compilateur de gérer ça correctement de toute façon en faisant un appel "mastring".equals(var) plutôt qu'un ==, ça doit pas être bien compliqué.
    ce n'est pas ça le propos…

    la distance entre les niveaux sémantiques du "switch" et de la "String" sont trop grands pour les mélanger…

    à la limite un "switch" sur un "char []" serait acceptable de ce point de vue…
    mais pas une String…

    (Strasse == Straße et autres joyeusetés…)

  13. #113
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Je suis pour.

    J'irais même un peu plus loin en proposant le switch pour les objets.
    Voir mon blog pour plus de détail (en anglais)
    http://www.jroller.com/agoubard/entry/switch_on_objects

    Anthony

  14. #114
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    ce n'est pas ça le propos…

    la distance entre les niveaux sémantiques du "switch" et de la "String" sont trop grands pour les mélanger…

    à la limite un "switch" sur un "char []" serait acceptable de ce point de vue…
    mais pas une String…

    (Strasse == Straße et autres joyeusetés…)
    Je pense qu'il n'y a pas de différence entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    switch (varString)
    {
       case "printemps" :
          ...
       case "été" :
          ...
       case "automne" :
          ...
       case "hiver" :
          ...
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if ( varString.equals("printemps") )
    {
       ...
    }
    else if ( varString.equals("été") )
    {
       ...
    }
    else if ( ... )
    ...etc
    Et le switch est beaucoup plus lisible, je ne vois pas ce qui te dérange.
    Dans ton exemple, ce n'est pas en passant par un tableau de char que tu auras une égalité entre "Strasse" et "Straße" pour autant.

    Si encore on prenait en compte l'encodage mixe des caractères (ISO-8859-1 et UTF-8 par exemple) où effectivement il y a une différence entre 2 représentations du même mot, je comprendrais une quelconque réticence (même si dans tous les cas, les suites de "if" ne règleront pas le problème)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #115
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Dans ton exemple, ce n'est pas en passant par un tableau de char que tu auras une égalité entre "Strasse" et "Straße" pour autant.
    La classe Collator sert justement à ca.

    Si le switch(String) utilise "String.equals()" c'est moins puissant que faire un "if Collator.compare()"
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  16. #116
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    La classe Collator sert justement à ca.

    Si le switch(String) utilise "String.equals()" c'est moins puissant que faire un "if Collator.compare()"
    Tu veux dire que la classe Collator ne distingue aucune différence entre 2 caractères "ss" et un "ß" ???

    Ça m'intrigue, je ferai un test à l'occasion (d'ailleurs merci en passant, je ne connaissais pas Collator, ça résoudra pas mal de choses... )

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  17. #117
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Tu veux dire que la classe Collator ne distingue aucune différence entre 2 caractères "ss" et un "ß" ???

    Ça m'intrigue
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Collator collator = Collator.getInstance(Locale.FRENCH);
    collator.setStrength(Collator.PRIMARY);
     
    if (collator.compare("Straße", "Strasse")==0) 
    	System.out.println("Tout pareil");
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  18. #118
    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 ant_ams Voir le message
    J'irais même un peu plus loin en proposant le switch pour les objets.
    Cela pose quand même certains problèmes :
    • De synchronisation : les objets pourraient bien être modifié depuis un autre thread.
    • D'immuabilité : les objets ne sont pas forcément immuable et leurs valeurs peut bien changer pendant qu'on est dans le switch
    • De validité du code : le compilateur ne peut pas comparer les différentes valeurs des objets, et on peut donc se retrouver avec plusieurs case qui sont en réalité identique, par exemple :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      		BigDecimal d1 = new BigDecimal(1);
      		BigDecimal d2 = new BigDecimal("1");
       
       
      		switch(value) {
      		case d1: 
      			// ...
      			break;
      		case d2:
      			// ...
      			break;
      		}


    De plus cela empêche le compilateur d'effectuer les optimisations habituelles...

    Bref un switch case sur des objets "standards" je ne suis pas trop pour...


    Citation Envoyé par OButterlin Voir le message
    Je pense qu'il n'y a pas de différence entre :
    Si il peut y en avoir une : pour les int le switch utilise un espèce de table de hashage pour améliorer les performances. On peut raisonnablement penser que ce serait la même chose pour les String...

    Mais je te l'accorde dans 99% des cas la différence avec des if/else ne sera pas flagrante

    Citation Envoyé par OButterlin Voir le message
    Ça m'intrigue, je ferai un test à l'occasion (d'ailleurs merci en passant, je ne connaissais pas Collator, ça résoudra pas mal de choses... )
    Les Collators permettent de comparer des chaines de caractères avec des règles plus souples qu'une simple comparaison "binaire", et permet ainsi de prendre en compte certaines spécificités des locales...

    Comment comparer des chaînes de caractères selon la Locale ?

    a++

  19. #119
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Code java :

    Collator collator = Collator.getInstance(Locale.FRENCH);
    collator.setStrength(Collator.PRIMARY);

    if (collator.compare("Straße", "Strasse")==0)
    &nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Tout pareil");
    Effectivement, j'ai testé, même si ça m'étonne, ça marche, c'est identique pour lui...

    Merci
    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  20. #120
    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 OButterlin Voir le message
    Effectivement, j'ai testé, même si ça m'étonne, ça marche, c'est identique pour lui...
    ß dérive de ss donc c'est normal qu'il trouve que c'est la même chose. C'est comme le œ et le oe de la langue française :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	Collator collator = Collator.getInstance(Locale.FRENCH);
    	collator.setStrength(Collator.SECONDARY);
     
    	if (collator.compare("oeil", "œil")==0) 
    		System.out.println("Tout pareil");
    Le Collator en mode SECONDARY ou moins ignore ce type de différence

    a++

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/08/2009, 17h09
  2. Réponses: 2
    Dernier message: 07/06/2009, 19h54
  3. les classes et les templates dans les plugins
    Par asoka13 dans le forum C++
    Réponses: 22
    Dernier message: 24/01/2008, 17h11
  4. Réponses: 4
    Dernier message: 11/09/2006, 16h55
  5. Les polices dans les tables et les requêts
    Par zooffy dans le forum Access
    Réponses: 3
    Dernier message: 21/06/2006, 11h06

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