Précédent   Forum du club des développeurs et IT Pro > Java > Communauté Java > Débats

Débats Les débats et sondages sur le langage et les technologies Java

Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Affichage des résultats du sondage: Êtes-vous pour ou contre cette proposition ?
Pour 404 85,77%
Contre 67 14,23%
Votants: 471. Vous ne pouvez pas participer à ce sondage.

Publicité
'
Réponse
 
Outils de la discussion
Vieux 04/01/2008, 22h24   #61
vbrabant
Expert Confirmé Sénior
 
Inscription : mai 2003
Messages : 3 293
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 3 293
Points : 7 670
Points : 7 670
Que pensez-vous de ce cas ?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
static boolean booleanFromString(String s) {
    switch(s) {
      case "true": 
      case "yes": 
      case "y":
      case "1":
        return true;
      case "false": 
      case "no": 
      case "n":
      case "0":
        return false;
      default:
        throw new IllegalArgumentException(s);
    }
}

Vincent
__________________
Vincent Brabant

Ne pas me contacter par MP ni par mail pour des questions techniques. Ma liste d'amis restera vide.
vbrabant est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2008, 23h06   #62
natha
Expert Confirmé
 
Avatar de natha
 
Inscription : janvier 2006
Messages : 2 344
Détails du profil
Informations personnelles :
Localisation : Suisse

Informations forums :
Inscription : janvier 2006
Messages : 2 344
Points : 2 861
Points : 2 861
Citation:
Envoyé par vbrabant Voir le message
Que pensez-vous de ce cas ?
Je dirais que c'est un excellent exemple pratique démontrant l'utilité dans certains cas de figure du switch de String.
On pourrait bien sûr faire une enum mais pour quel gain ??
__________________
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
natha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2008, 23h57   #63
djo.mos
Expert Confirmé Sénior
 
Avatar de djo.mos
 
Inscription : octobre 2004
Messages : 4 678
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 4 678
Points : 7 003
Points : 7 003
Bonjour.
Je vois que l'argument de l'enum revient sans cesse pour descridéter cette proposition, et c'est logique en un sens.
Mais il faut se mettre à l'esprit que ce n'est pas toujours possible de passer par un enum, ou d'avoir un enum.
Par exemple, avec l'exemple de Vincent, le s qu'on teste peut être une valeur entré par l'utilisateur dans une IHM quelconque, peut aussi parvenir du parsing d'un fichier, des données récupérés d'une socket, etc. etc. etc. J'aimerais bien voir comment on peut utiliser les enums dans ces cas ...
Autre cas de figure: lorsque les éventualités sont un peu trop nombreuses pour qu'on prenne la peine de les coder sous forme d'enums ... perso, je ne m'amuserais pas à le faire avec plus d'une douzaine de valeurs possibles
__________________
Mon Blog | Mes Cours | Moi sur twitter
djo.mos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2008, 10h32   #64
natha
Expert Confirmé
 
Avatar de natha
 
Inscription : janvier 2006
Messages : 2 344
Détails du profil
Informations personnelles :
Localisation : Suisse

Informations forums :
Inscription : janvier 2006
Messages : 2 344
Points : 2 861
Points : 2 861
Citation:
Envoyé par djo.mos Voir le message
J'aimerais bien voir comment on peut utiliser les enums dans ces cas ...
Techniquement parlant c'est très simple, cf cet exemple :

http://www.developpez.net/forums/sho...8&postcount=41

Le #valueOf a ses limites par contre car si on souhaite tester une saisie qui ne respecte pas les normes de nommage des variables java comme par exemple : "pèse-personne" (le tiret '-' n'est pas accepté, l'accent est déconseillé), ou "un avion" (l'espace pose problème), ça va doubler le travail de création de l'enum.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
enum MonEnum {
 
    PESE_PERSONNE("pèse-personne"),
    UN_AVION("un avion");
 
    String str;
    private MonEnum(String str) {
        this.str = str;
    }
 
    public static MonEnum valueFor(String str) {
        for (MonEnum me : values()) {
            if (me.str.equals(str)) {
                return me;
            }
        }
        return null;
    }
}
Ca devient vraiment pénible et je comprendrais qu'on préfère coder une succession de if/else plutôt que se taper l'enum.
__________________
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
natha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2008, 10h54   #65
djo.mos
Expert Confirmé Sénior
 
Avatar de djo.mos
 
Inscription : octobre 2004
Messages : 4 678
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 4 678
Points : 7 003
Points : 7 003
Voilou ! le valueOf est limité et ne permettrait certainement pas de faire la même chose que l'exemple de Vincent.
__________________
Mon Blog | Mes Cours | Moi sur twitter
djo.mos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2008, 16h13   #66
pseudocode
Rédacteur/Modérateur
 
Avatar de pseudocode
 
Homme Xavier Philippeau
Architecte système
Inscription : décembre 2006
Messages : 9 818
Détails du profil
Informations personnelles :
Nom : Homme Xavier Philippeau
Âge : 40
Localisation : France, Hérault (Languedoc Roussillon)

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

Informations forums :
Inscription : décembre 2006
Messages : 9 818
Points : 16 470
Points : 16 470
Citation:
Envoyé par natha Voir le message
Je dirais que c'est un excellent exemple pratique démontrant l'utilité dans certains cas de figure du switch de String.
On pourrait bien sûr faire une enum mais pour quel gain ??
on pourrait surtout le faire avec des Listes...

Code java :
1
2
3
4
5
6
7
8
static List<String> trueEntries  = Arrays.asList("true","yes","y","1");
static List<String> falseEntries = Arrays.asList("false","no","n","0");
 
static boolean booleanFromString(String s) {
	if (trueEntries.contains(s)) return true;
	if (falseEntries.contains(s)) return false;
	throw new IllegalArgumentException(s);
}
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
pseudocode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2008, 16h25   #67
natha
Expert Confirmé
 
Avatar de natha
 
Inscription : janvier 2006
Messages : 2 344
Détails du profil
Informations personnelles :
Localisation : Suisse

Informations forums :
Inscription : janvier 2006
Messages : 2 344
Points : 2 861
Points : 2 861
Citation:
Envoyé par pseudocode Voir le message
on pourrait surtout le faire avec des Listes...
C'est juste, bien vu !
Mais ça vaut pour les cas où plusieurs propositions provoquent le même résultat.
__________________
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
natha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2008, 16h38   #68
pseudocode
Rédacteur/Modérateur
 
Avatar de pseudocode
 
Homme Xavier Philippeau
Architecte système
Inscription : décembre 2006
Messages : 9 818
Détails du profil
Informations personnelles :
Nom : Homme Xavier Philippeau
Âge : 40
Localisation : France, Hérault (Languedoc Roussillon)

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

Informations forums :
Inscription : décembre 2006
Messages : 9 818
Points : 16 470
Points : 16 470
Citation:
Envoyé par natha Voir le message
C'est juste, bien vu !
Mais ça vaut pour les cas où plusieurs propositions provoquent le même résultat.
A mon avis le "switch(string)" n'est pas une solution à un problème fonctionnel.

Si vous avez des dizaines de "if (s.equals("xxxx"))" à la suite les uns des autres, la solution à votre probleme ce trouve plus dans un changement de "conception" qu'un changement de "syntaxe".
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
pseudocode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 08h55   #69
Uther
Expert Confirmé Sénior
 
Avatar de Uther
 
Homme
Inscription : avril 2002
Messages : 2 678
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : avril 2002
Messages : 2 678
Points : 5 107
Points : 5 107
Citation:
on pourrait surtout le faire avec des Listes...
Dans ce cas précis oui, mais ca reste une solution de contournement pour un problème particulier.
On perd une propriété essentielle du switch: travailler sur des constantes, de plus, le passage par une liste complique inutilement une opération triviale.
Je sais que l'optimisation n'est généralement pas la priorité des développeurs JAVA, mais ca ne fait jamais de mal.
Uther est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 10h33   #70
pseudocode
Rédacteur/Modérateur
 
Avatar de pseudocode
 
Homme Xavier Philippeau
Architecte système
Inscription : décembre 2006
Messages : 9 818
Détails du profil
Informations personnelles :
Nom : Homme Xavier Philippeau
Âge : 40
Localisation : France, Hérault (Languedoc Roussillon)

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

Informations forums :
Inscription : décembre 2006
Messages : 9 818
Points : 16 470
Points : 16 470
Citation:
On perd une propriété essentielle du switch: travailler sur des constantes
DAns ce cas il faudrait etendre le switch() a tous les objets immutable (BigInteger, ...). Mais comment reconnaitre un immutable en Java ? (sachant qu'on peut modifier une String par reflection).

Citation:
Envoyé par Uther Voir le message
Dans ce cas précis oui, mais ca reste une solution de contournement pour un problème particulier.
(...)
Je sais que l'optimisation n'est généralement pas la priorité des développeurs JAVA, mais ca ne fait jamais de mal.
Je ne sais pas comment sera implémenté le switch(string), mais battre une recherche dans un HashSet() ca va etre dur.
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
pseudocode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 10h57   #71
adiGuba
Expert Confirmé Sénior
 
Avatar de adiGuba
 
Homme
Développeur Java/Web
Inscription : avril 2002
Messages : 12 657
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Corse (Corse)

Informations professionnelles :
Activité : Développeur Java/Web
Secteur : Transports

Informations forums :
Inscription : avril 2002
Messages : 12 657
Points : 22 438
Points : 22 438
Citation:
Envoyé par pseudocode Voir le message
DAns ce cas il faudrait etendre le switch() a tous les objets immutable (BigInteger, ...). Mais comment reconnaitre un immutable en Java ? (sachant qu'on peut modifier une String par reflection).
Les String ont quand même un status particulier puisqu'il peuvent être défini en tant que constante, ce qui n'est pas le cas des autres types d'objets...

Citation:
Envoyé par pseudocode Voir le message
Je ne sais pas comment sera implémenté le switch(string), mais battre une recherche dans un HashSet() ca va etre dur.
Cela pourrait intégrer une sorte de hashset directement dans le bytecode...
D'ailleurs il me semble que c'est déjà fait ainsi pour les switch standard !


a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java Présentation de Java SE 7 (commentaires)
adiGuba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 11h01   #72
Uther
Expert Confirmé Sénior
 
Avatar de Uther
 
Homme
Inscription : avril 2002
Messages : 2 678
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : avril 2002
Messages : 2 678
Points : 5 107
Points : 5 107
Citation:
Envoyé par pseudocode Voir le message
DAns ce cas il faudrait etendre le switch() a tous les objets immutable (BigInteger, ...). Mais comment reconnaitre un immutable en Java ? (sachant qu'on peut modifier une String par reflection).
Je ne parlais pas détendre à tous les immutables mais juste aux Strings constants, ce qui ne devrait pas poser de problèmes vu qu'ils posèdent déjà un traitement particulier en JAVA ou ils sont "inline" de la même manière que les types de base.

Après si tu modifies un String par réflexion(je ne savais pas que la réflexion authorisait ce genre de chose), c'est un détournement de l'usage normal de JAVA. Celui qui fait ça, a quand même quelques connaissances et sait qu'il faut s'attendre au pire vu que:
  • Le but d'une classe Immuable, c'est justement d'empecher ça.
  • les Strings(et particulièrement les constants) ont droit à des traitements bien particuliers.
Je serais bien curieux de voir ce que ca donne de modifier un String constant par réflexion, ca doit réserver quelques surprises.
Uther est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 11h32   #73
pseudocode
Rédacteur/Modérateur
 
Avatar de pseudocode
 
Homme Xavier Philippeau
Architecte système
Inscription : décembre 2006
Messages : 9 818
Détails du profil
Informations personnelles :
Nom : Homme Xavier Philippeau
Âge : 40
Localisation : France, Hérault (Languedoc Roussillon)

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

Informations forums :
Inscription : décembre 2006
Messages : 9 818
Points : 16 470
Points : 16 470
Citation:
Envoyé par Uther Voir le message
Je serais bien curieux de voir ce que ca donne de modifier un String constant par réflexion, ca doit réserver quelques surprises.
effectivement:

http://www.developpez.net/forums/sho...&postcount=720
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
pseudocode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 11h49   #74
Uther
Expert Confirmé Sénior
 
Avatar de Uther
 
Homme
Inscription : avril 2002
Messages : 2 678
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : avril 2002
Messages : 2 678
Points : 5 107
Points : 5 107
En effet c'est bien le genre de surprise auquel je pensais, et il doit y en avoir bien d'autres.

C'est bizarre j'aurais cru naivement que la réflexion sur des éléments inaccessibles levait une exception. C'est quand même un sacré trou dans l'encapsulation! Même si ca me plait de savoir que l'on peut briser quelque règles de temps en temps.
Uther est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 12h12   #75
adiGuba
Expert Confirmé Sénior
 
Avatar de adiGuba
 
Homme
Développeur Java/Web
Inscription : avril 2002
Messages : 12 657
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Corse (Corse)

Informations professionnelles :
Activité : Développeur Java/Web
Secteur : Transports

Informations forums :
Inscription : avril 2002
Messages : 12 657
Points : 22 438
Points : 22 438
Citation:
Envoyé par Uther Voir le message
C'est bizarre j'aurais cru naivement que la réflexion sur des éléments inaccessibles levait une exception. C'est quand même un sacré trou dans l'encapsulation! Même si ca me plait de savoir que l'on peut briser quelque règles de temps en temps.
On ne peut pas tout avoir : une réflection puissante sans aucun "risque"...

A noter quand même que cela impose l'utilisation de setAccessible() ET que cela pourrait être bloqué par un SecurityManager...

a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java Présentation de Java SE 7 (commentaires)
adiGuba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 12h14   #76
pseudocode
Rédacteur/Modérateur
 
Avatar de pseudocode
 
Homme Xavier Philippeau
Architecte système
Inscription : décembre 2006
Messages : 9 818
Détails du profil
Informations personnelles :
Nom : Homme Xavier Philippeau
Âge : 40
Localisation : France, Hérault (Languedoc Roussillon)

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

Informations forums :
Inscription : décembre 2006
Messages : 9 818
Points : 16 470
Points : 16 470
Citation:
Envoyé par Uther Voir le message
C'est bizarre j'aurais cru naivement que la réflexion sur des éléments inaccessibles levait une exception.
c'est configurable: on en parle dans le reste de la discussion...

Citation:
C'est quand même un sacré trou dans l'encapsulation! Même si ca me plait de savoir que l'on peut briser quelque règles de temps en temps.
Ce n'est pas un trou. Pour moi "Immuable" n'est pas synonyme de "attribut privé". C'est pour ca que je suis contre un switch() sur la valeur d'un litteral String (qui n'est pas immuable) mais je suis pour un switch() sur la reference d'une instance d'un enum (qui est immuable).
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
pseudocode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 12h33   #77
adiGuba
Expert Confirmé Sénior
 
Avatar de adiGuba
 
Homme
Développeur Java/Web
Inscription : avril 2002
Messages : 12 657
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Corse (Corse)

Informations professionnelles :
Activité : Développeur Java/Web
Secteur : Transports

Informations forums :
Inscription : avril 2002
Messages : 12 657
Points : 22 438
Points : 22 438
Citation:
Envoyé par pseudocode Voir le message
Ce n'est pas un trou. Pour moi "Immuable" n'est pas synonyme de "attribut privé". C'est pour ca que je suis contre un switch() sur la valeur d'un litteral String (qui n'est pas immuable) mais je suis pour un switch() sur la reference d'une instance d'un enum (qui est immuable).
Il est possible de casser n'importe quelle objet ou règle d'immuabilité avec
La réflection et setAccessible(true)... et même les enums (après tout il s'agit ni plus ni moins d'un objet) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Surprise {
 
	enum MonEnum {
		AAA, BBB;
	}
 
	public static void main(String[] args) throws Exception {
 
		System.out.println(MonEnum.AAA);
		doEvil();
		System.out.println(MonEnum.AAA);
 
	}
 
	static void doEvil() throws Exception {
		java.lang.reflect.Field field = Enum.class.getDeclaredField("name");
		field.setAccessible(true);
		field.set(MonEnum.AAA, "CCC");
	}
}

Mais l'utilisation de setAccessible() est vraiment très limité et pas très propre lorsque c'est fait n'importe comment...


a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java Présentation de Java SE 7 (commentaires)
adiGuba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 12h45   #78
pseudocode
Rédacteur/Modérateur
 
Avatar de pseudocode
 
Homme Xavier Philippeau
Architecte système
Inscription : décembre 2006
Messages : 9 818
Détails du profil
Informations personnelles :
Nom : Homme Xavier Philippeau
Âge : 40
Localisation : France, Hérault (Languedoc Roussillon)

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

Informations forums :
Inscription : décembre 2006
Messages : 9 818
Points : 16 470
Points : 16 470
Citation:
Envoyé par adiGuba Voir le message
Il est possible de casser n'importe quelle objet ou règle d'immuabilité avec La réflection et setAccessible(true)... et même les enums (après tout il s'agit ni plus ni moins d'un objet) :
Peut-on peut modifier la valeur de la reference (internal address) d'une instance ?

Je pensais que le switch(enum) utilisait la "reference" de l'instance , mais peut-etre me trompe-je.
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
pseudocode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 13h03   #79
adiGuba
Expert Confirmé Sénior
 
Avatar de adiGuba
 
Homme
Développeur Java/Web
Inscription : avril 2002
Messages : 12 657
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Corse (Corse)

Informations professionnelles :
Activité : Développeur Java/Web
Secteur : Transports

Informations forums :
Inscription : avril 2002
Messages : 12 657
Points : 22 438
Points : 22 438
Citation:
Envoyé par pseudocode Voir le message
Peut-on peut modifier la valeur de la reference (internal address) d'une instance ?
Non...

Citation:
Envoyé par pseudocode Voir le message
Je pensais que le switch(enum) utilisait la "reference" de l'instance , mais peut-etre me trompe-je.
C'est vrai.

Mais que ce soit pour les String ou les enums la reflection permet de changer les données d'une instance, donc le problème est le même en fait...

a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java Présentation de Java SE 7 (commentaires)
adiGuba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 13h35   #80
Uther
Expert Confirmé Sénior
 
Avatar de Uther
 
Homme
Inscription : avril 2002
Messages : 2 678
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : avril 2002
Messages : 2 678
Points : 5 107
Points : 5 107
Citation:
Envoyé par adiGuba Voir le message
On ne peut pas tout avoir : une réflection puissante sans aucun "risque"...

A noter quand même que cela impose l'utilisation de setAccessible() ET que cela pourrait être bloqué par un SecurityManager...

a++
Ok je viens de rejeter un coup d'oeil dans la doc en ce qui concerne la réflexion et elle est bien protégée comme il me semblait m'en souvenir. Ce qui m'avait échappé, c'est que cette protection pouvait être levée par le setAccessible(true).
Donc c'est en effet une bonne chose: on est parfaitement conscient de ce que l'on fait quand on décide d'enfreindre les règles.

Cela me renforce d'autant plus dans l'idée que celui qui utilise setAccessible(true), particulièrement pour modifier des champs non documentés, sait à quoi il s'expose. On n'a pas a se poser de question pour lui. De toule façon avec la réflexion sans contrôle, on est suceptible de faire les pires saloperies possibles avec les String, le cas du switch n'étant qu'un problème parmi d'autres.
Uther est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 00h37.


 
 
 
 
Partenaires

Hébergement Web