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. #21
    Membre éprouvé
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Points : 936
    Points
    936
    Par défaut
    Citation Envoyé par bobuse Voir le message
    En fait, si n!co pense bien comme moi, ce n'est pas que le switch serait plus crado que des if/then/else, mais que c'est le fait d'utiliser des String pour conditionner des actions qui est crado. Il vaut mieux effectivement utiliser des enums
    C'est bien à cela que je pensais => soit un element de plus a maintenir pour être sur que si tu change un string a un endroit, faut pas oublier de le modifier de l'autre.

    Ce qui aujourd'hui est élégament réglé avec les énums ...
    Netbeans account : nico@share.java.net
    Merci de ne pas poser de questions techniques par MP

  2. #22
    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 n!co Voir le message
    C'est bien à cela que je pensais => soit un element de plus a maintenir pour être sur que si tu change un string a un endroit, faut pas oublier de le modifier de l'autre.

    Ce qui aujourd'hui est élégament réglé avec les énums ...

    Je renchéris : le Java, ce n'est pas du PHP. Je vote contre !

    Par contre, pourquoi ne fait-on pas un switch d'objet ? Pour quelques algorythmes complexes, je renvois soit un Integer, soit un Objet complexe. Un switch basé sur les références est 100% entretenable en refactoring, non ?

  3. #23
    Membre actif Avatar de DrHelmut
    Homme Profil pro
    Software craftsman - JS, Java...
    Inscrit en
    Octobre 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Software craftsman - JS, Java...
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 112
    Points : 215
    Points
    215
    Par défaut
    Contre...

    Car bien que ça parte d'une bonne intention au départ, cela implique des complications inutiles car d'autres pratiques équivalentes (et pas plus lourdes - genre Enum) existent. 3 ans que je code en java en m'en passant très bien perso...

    Les complications inutiles que j'y voit :

    - Implémenter switch/case avec des String mais pas avec tous les objets ne serait ABSOLUMENT PAS dans la philosophie objet (de java en tout cas)
    En effet pourquoi une opération fonctionnertait avec UN type d'objet et pas avec les autres ? Ce serait une première ! (non ?)

    - Avec les IDE, simplifier la syntaxe de Java ne servira pas à grand chose je pense et ça alourdirait ou impliquerait des modifications plus ou moins significatives de la JVM pour un gain très peu significatif.

    - Un NullPointerException potentiel...

  4. #24
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Points : 4 265
    Points
    4 265
    Par défaut
    Je suis d'une même avis que coyote.

    Citation Envoyé par coyote999 Voir le message
    Je suis pour mais je serais d'avis de ne pas seulement se limiter au type String. Pourquoi ne pas aller plus loin et permettre un switch qui pourrait comparer des objets identiques.

    On pourrait comparer des String, des BigDecimals mais également des classes que nous avons développé nous-mêmes.

    Tout le monde savait que c'était impossible. Il est venu un imbécile qui ne le savait pas et qui l'a fait. Marcel PAGNOL
    On ne savait pas que c'était impossible, alors on l'a fait. John Fitzgerald KENNEDY.
    L'inexpérience est ce qui permet à la jeunesse d'accomplir ce que la vieillesse sait impossible. Paul (Tristant) BERNARD
    La meilleure façon de prédire l'avenir, c'est de l'inventer.

  5. #25
    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
    Les String sont souvent utilisées un peu partout comme clés (ActionCommand, Layout, etc.).
    Apporter un switch se révèlera très intéressant pour tous ces endroits où il faut soit faire des if/else, soit créer une enum et faire des astuces style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set(monEnum.name())
    MonEnum.valueOf(get())
    Pour maîtriser totalement le type. Mais c'est un peu lourdingue.

    Alors oui pour le switch sur String.

    Contre le switch généralisé car créer une instance d'un objet par case juste pour comparer, ça va pas me plaire du tout Comme l'a dit adiGuba je crois, le type String est un type particulier entre le primitif et l'objet normal.
    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

  6. #26
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Citation Envoyé par DrHelmut Voir le message
    Contre...

    Car bien que ça parte d'une bonne intention au départ, cela implique des complications inutiles car d'autres pratiques équivalentes (et pas plus lourdes - genre Enum) existent. 3 ans que je code en java en m'en passant très bien perso...

    Les complications inutiles que j'y voit :

    - Implémenter switch/case avec des String mais pas avec tous les objets ne serait ABSOLUMENT PAS dans la philosophie objet (de java en tout cas)
    En effet pourquoi une opération fonctionnertait avec UN type d'objet et pas avec les autres ? Ce serait une première ! (non ?)
    Non ce n'est pas une première, l'opérateur + est surchargé pour les String (opérateur de concaténation) et pas pour les autres objets.

    Sinon perso, ayant fait du C# et considérant le fait que le switch sur les String est possible en C#, je suis plutôt pour avoir la même chosee en Java.

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  7. #27
    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 Deadpool Voir le message
    Non ce n'est pas une première, l'opérateur + est surchargé pour les String (opérateur de concaténation) et pas pour les autres objets.
    L'opérateur + est surchargé pour tous les objets... mais il génère une String

    Mais les String sont quand même des objets bien particulier, il possède leurs propre littéral et pas mal de spécificité par rapport aux autres objets. En particulier ils peuvent être utilisé comme constante (et donc déterminé à la compilation).

    Ce qui permettrait de les utiliser dans un switch, contrairement aux objets standards car le compilateur ne pourrait pas vérifier leurs valeurs et les éventuelles problèmes que cela pourrait poser (doublons, etc...).



    Et un switch est quand même bien plus pratique qu'un suite de if/else ou qu'un grosse Map d'association...



    En parlant des switch j'aimerais bien également avoir la possibilité d'utiliser un interval de données avec les types numériques, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    switch(intValue) {
        case 0-9:
               ...
               break;
        case 10-99:
               ...
               break;
        default:
               ...
               break;
    }
    Actuellement on est obligé d'utiliser un case par valeur


    a++

  8. #28
    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 adiGuba Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    switch(intValue) {
        case 0-9:
               ...
               break;
        case 10-99:
               ...
               break;
        default:
               ...
               break;
    }
    Oui, ça serait pas mal du tout...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #29
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    L'opérateur + est surchargé pour tous les objets... mais il génère une String
    C'est pas faux.

    Non en fait je voulais dire que par exemple on pouvait faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String a = "toto";
    String b = "tata";
    String c = a + b;
    mais pas ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    BigInteger i = BigInteger.valueOf(1);
    BigInteger j = BigInteger.valueOf(2);
    BigInteger k = i + j;
    //ne compile pas
    //Erreur :The operator + is undefined for the argument types java.math.BigInteger, java.math.BigInteger.
    Mais c'est vrai que c'était pas clair.


    En java 5 ça marche quand même avec les types wrappers du fait de l'auto-(un)boxing.

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  10. #30
    Membre confirmé
    Avatar de bmoussaud
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2003
    Messages : 218
    Points : 555
    Points
    555
    Par défaut
    Trop longtemps que j'attend cette fonctionnalité
    Benoit Moussaud - XebiaLabs - Automatisation des déploiements. Screencast & Demo

  11. #31
    Rédacteur
    Avatar de longbeach
    Profil pro
    Architecte de système d’information
    Inscrit en
    Avril 2003
    Messages
    943
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Avril 2003
    Messages : 943
    Points : 2 370
    Points
    2 370
    Par défaut
    je suis complètement pour.

  12. #32
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Points : 393
    Points
    393
    Par défaut
    On peut pas pousser plus loin le langage ?

    Avec les primitifs on compare à la fois l'égalité et l'identité

    Avec les strings on compare le concept d'égalité.

    On devrait pouvoir faire cette comparaison avec tout type d'objet.

    Et mieux

    switch equality{ } pour un equals

    switch identity{ } pour un ==

  13. #33
    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 Alec6 Voir le message
    On peut pas pousser plus loin le langage ?
    C'est dangereux de vouloir trop en faire.
    Je ne vois pas vraiment de besoin pour les autres types d'objets.
    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

  14. #34
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 34
    Points : 41
    Points
    41
    Par défaut
    Comme dit par plusieurs d'entre vous , je suis pour parce que c'est clair que dans certains cas ( ils ne sont pas nombreux non plus ) cette possibilité m'a énormément manqué, mais il faut quand même ne pas oublier que les enums ont souvent palier à ce problème.

  15. #35
    Membre habitué Avatar de cysboy
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    221
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 221
    Points : 168
    Points
    168
    Par défaut
    Je suis pour aussi à 200%.
    Cà manquait vraiment et c' est très pratique !

  16. #36
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Je suis pour, principalement parce que les Strings sont historiquement utilisés comme clé/constante dans pas mal de coins de l'API. Par contre je trouve que ça ne suffit pas, il faudrait généraliser ça, parce qu'il est mieux d'avoir une règle qu'une exception, et l'étendre sur tous les Objets avec la méthode equals. Libre au développeur de surcharger cette méthode pour utiliser l'égalité pointeur ==.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  17. #37
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 2
    Points : 3
    Points
    3
    Par défaut A fond!!!
    Le switch avec des Strings simpifiera la vie des développeurs dans de nombreux cas:
    1-Dans les factory on pourra faire un switch sur le nom de la classe
    2-Dans les MVC switch sur les actions

    Les if-else sont mort, vive les siwtch !!

  18. #38
    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 xavlours Voir le message
    Par contre je trouve que ça ne suffit pas, il faudrait généraliser ça, parce qu'il est mieux d'avoir une règle qu'une exception, et l'étendre sur tous les Objets avec la méthode equals. Libre au développeur de surcharger cette méthode pour utiliser l'égalité pointeur ==.
    Si cela serait généralisé sur tout les objets on aurait encore plus d'exception, avec :
    • D'un coté le switch sur les types primitifs et les String, qui utiliserait des constantes vérifié par le compilateur et dont le résultat sera toujours le même pour une valeur donné, et surement optimisé par le compilateur (car connaissant les valeurs des case, il peut les ordonner).

    • De l'autre coté le switch sur les objets, basé sur le couple hashCode()/equals(), avec des objets dont la valeur est inconnu à la compilation, et dont la valeur pourrait varier au court du temps...



    Perso si je suis plutôt pour le switch sur les String, je ne suis pas d'accord pour le généraliser à tous les objets...

    a++

  19. #39
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Points : 4 265
    Points
    4 265
    Par défaut
    Citation Envoyé par zefyre Voir le message
    Le switch avec des Strings simpifiera la vie des développeurs dans de nombreux cas:
    1-Dans les factory on pourra faire un switch sur le nom de la classe
    2-Dans les MVC switch sur les actions

    Les if-else sont mort, vive les siwtch !!
    Je suis pour le switch des String dans certains cas mais absolument contre pour les exemples que tu donnes.

    Personnellement, je pense que les utiliser dans ces cas font du mauvais code
    à moins que j'ai mal compris ou que des exemples concrets me soient montré.

    Pourquoi faire un switch dans les factory ? Pour choisir une implémentation particulière ? Mieux vaut à mon avis faire une injection de dépendance (via Spring ou autre, un simple fichier de paramétrage par exemple) ou bien un tableau de String avec une constante pour l'indice.

    Pour ce qui est du switch sur les actions, ce n'est pas mieux !!!
    Cela me rappelle une blague d'un prof sur les menus :
    Un développeur débutant fait un test de l'item du menu pour déclencher l'action appropriée.
    Un développeur de chez Microsoft fait une étude statistique pour mettre en haut du menu (et tester en premier) les items qui ont le plus de chance d'être executé.
    Un développeur de C++ fait un tableau de pointeur de fonctions.

    En tant que développeur Java, je code des objets actions avec une méthode execute qui fait directement mon traitement sans faire une suite de tests (switch ou pas ...)

    Tout le monde savait que c'était impossible. Il est venu un imbécile qui ne le savait pas et qui l'a fait. Marcel PAGNOL
    On ne savait pas que c'était impossible, alors on l'a fait. John Fitzgerald KENNEDY.
    L'inexpérience est ce qui permet à la jeunesse d'accomplir ce que la vieillesse sait impossible. Paul (Tristant) BERNARD
    La meilleure façon de prédire l'avenir, c'est de l'inventer.

  20. #40
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 259
    Points : 607
    Points
    607
    Par défaut
    Euh moi je le ferai pas avec un == ce switch, l'appel du equals() fait très bien l'affaire, et ainsi ca serait généralisé aux objets et non plus aux Strings.
    De plus ca ne se remplace pas toujours par des enum, par exemple une entrée utilisateur qui est une String on pourrait faire
    switch (val)
    {
    case "val1":faire un truc;break;
    case "val2":faire un truc;break;
    ...
    default : entréeinvalide;break;
    }
    Si on a un enum il faut déjà retrouver a quelle valeur de l'enum correspond la String

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