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 08/01/2008, 13h45   #81
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
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...
Heu... non. Changer les données dans une instance d'enum ne modifie pas la fonction rendue par le switch:

Code java :
1
2
3
4
5
6
7
8
9
10
11
12
 
MyEnum somevalue = MyEnum.VALUE1;
 
// (...) 
somevalue.internalvalue = 1.23456; 
// (...)
 
switch (somevalue) {
case VALUE1: System.out.println("VALUE1");  break;
case VALUE2: System.out.println("VALUE2");  break;
default:     System.out.println("don't know"); break;
}
__________________
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, 14h36   #82
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
Heu... non. Changer les données dans une instance d'enum ne modifie pas la fonction rendue par le switch:
C'est tout simplement parce que tu modifies un champs qui n'est pas utilisé pour identifier l'enum. Si tu modifies les champs name ou ordinal tu obtiendras bien des résultats incorrects...

Par exemple le switch est basé sur l'ordinal de l'enum, et avec cette méthode doEvil() tu as VALUE1 qui vaut VALUE2 :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Surprise {
 
	enum MonEnum {
		VALUE1, VALUE2;
	}
 
	public static void main(String[] args) throws Exception {
		doEvil();
		switch (MonEnum.VALUE1) {
			case VALUE1: System.out.println("VALUE1");  break;
			case VALUE2: System.out.println("VALUE2");  break;
			default:     System.out.println("don't know"); break;
		}
 
	}
 
	static void doEvil() throws Exception {
		java.lang.reflect.Field field = Enum.class.getDeclaredField("ordinal");
		field.setAccessible(true);
		field.set(MonEnum.VALUE1, 1); // ordinal passe de 0 à 1
	}
}

Mais bon le problème ne vient pas de String ou Enum mais d'une mauvaise utilisation de la réflection...


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, 16h40   #83
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
C'est tout simplement parce que tu modifies un champs qui n'est pas utilisé pour identifier l'enum. Si tu modifies les champs name ou ordinal tu obtiendras bien des résultats incorrects...
Ah, oui. Désolé. . J'avais pas pensé a modifier "ordinal". Bon cela dit c'est vrai que tout ca n'a pas trop de rapport avec la discussion actuelle.

Au fait, est-ce qu'il sera possible de sortir les "constantes" du switch ?
Code java :
1
2
3
4
5
6
7
8
9
 
final String YES = "Yes";
final String NO = "No";
 
switch(s) {
case YES: break;
case NO: break;
default: break;
}
__________________
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, 16h51   #84
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
Ca paraitrait logique, vu que c'est le cas pour les int, char,...

En tout cas si ce n'est pas le cas ça serait génant.
Uther est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 16h57   #85
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
Bon cela dit c'est vrai que tout ca n'a pas trop de rapport avec la discussion actuelle.
Oui c'est vrai on a un peu (beaucoup) dévié...

Citation:
Envoyé par Uther
Ca paraitrait logique, vu que c'est le cas pour les autre types.
+1

En fait cela dépend. Par exemple avec le code suivant :
Code :
final String YES = "Yes";
YES est bien une constante et lorsqu'on l'utilise le compilateur effectue en fait un remplacement de valeur...


Par contre si tu a :
Code :
final String YES = maMethodeQuiRenvoiYes();
YES n'est pas une constante car elle ne peut pas être connu à la compilation, et ne pourra donc pas être remplacé par le compilateur.
Dans ce cas elle ne pourra pas non plus être utilisé dans un swith...


Plus d'info sur les constantes dans la FAQ : Qu'est-ce qu'une constante ?


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 11/01/2008, 23h25   #86
leonardoo
Membre à l'essai
 
Inscription : septembre 2005
Messages : 43
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 43
Points : 21
Points : 21
Bonsoir,

Je pense pas cette fonctionnalité va révolutionner le monde même si j'ai voté "pour".

Pour avoir le "==" suffit d'appeler la méthode "intern".

Je me demandais plutôt, si via une surcharge de l'opérateur "==" ou la méthode "equals" (pour rester dans "java" et non c++), on peut appeler switch sur Object.


Cordialement.
leonardoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2008, 15h00   #87
zambizi
Membre du Club
 
Avatar de zambizi
 
Inscription : juin 2007
Messages : 109
Détails du profil
Informations personnelles :
Âge : 30

Informations forums :
Inscription : juin 2007
Messages : 109
Points : 61
Points : 61
j'ai voté pour, c'est tres utile!
merci
zambizi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2008, 01h17   #88
®om
Expert Confirmé
 
Avatar de ®om
 
Inscription : janvier 2005
Messages : 2 807
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 807
Points : 2 821
Points : 2 821
Contre. Je ne vois pas l'intérêt.

Les switch pour moi ne servent que pour les enums (et avec les entiers, car avant les enums n'existaient pas).
Ça permet de parcourir différents cas, par exemple, comme vu précédemment :
Code :
1
2
3
4
5
6
7
public void handleSeason(Season season) {
    switch(season) {
        case SUMMER: ...
        case WINTER: ...
        default: ...
    }
}
Cette proposition inciterait les gens à tout écrire en String plutôt qu'à imposer statiquement un ensemble de valeurs.
Déjà que ça se fait déjà, et je trouve ça très moche, ça donnerait ça:
Code :
1
2
3
4
5
6
public void handleSeason(String season) {
    switch(season) {
         case "summer": ...
         case "winter": ...
         default: ...
    }
La différence avec le cas précédent, c'est que le contenu de la variable season est vérifié à la compilation dans le premier cas et n'est même pas vérifié dans le 2e cas (si season vaut "winmer", la compilation ne plante pas).

Sans parler des problèmes de charset, de equalsIgnoreCase, etc...
®om est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2008, 16h18   #89
yolepro
Membre Expert
 
Avatar de yolepro
 
Inscription : mai 2002
Messages : 914
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations forums :
Inscription : mai 2002
Messages : 914
Points : 1 106
Points : 1 106
J'ai voté contre,

Je préfère garder la syntaxe if else pour les comparaisons d'objet et les switch case pour les enumérations (cela oblige la personne à faire des énumérations et évite les problèmes de "magic number" déjà trop récurent).
__________________
Etre c'est etre relatif.
yolepro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2008, 11h23   #90
Bollagain
Candidat au titre de Membre du Club
 
Inscription : février 2008
Messages : 13
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 13
Points : 14
Points : 14
Pour cette proposition.

D'abord, je suis d'accord avec Uther et les autes intervenant qui ont préciser que le type String est un type tout a fait particuleir du langage Java. Les arguments contre cette proposition en raison du caractère Objet du langage ne me paraisse pas opportun dans ce cas, a moins que l'on souhaite remettre en question le statut si bizzare de String (ce qui est un autre débat, ... )

Par contre, l'argument de pseudocode résume assez bien ma perplexité
Citation:
A mon sens un switch() s'utilise avec une liste de valeurs fixes et connues "a priori" => une liste de constante => un Enum.
Ce type de modification rend possible des codes du type
Code :
1
2
3
4
5
6
7
8
9
10
 
Stirng s = "AAA" ;
switch(s) {
      case "AAA":
        s = "BBB";
      case "BBB":
        s = "CCC";
      default:
        throw new IllegalArgumentException(s);
    }
Sans que cela soit choquant, cela perturbe ma marote personnelle qui concerne l'importance extrème que j'accord à la lisbilité du code.

Donc, quand cela sera adopté, je ferais tout pour que, dans les standards de codage que nous utilisons, la String utilisée dans un Switch ne soit modifé dans ce même switch!
Bollagain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2008, 11h53   #91
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 Bollagain Voir le message
Donc, quand cela sera adopté, je ferais tout pour que, dans les standards de codage que nous utilisons, la String utilisée dans un Switch ne soit modifé dans ce même switch!
Ils pourraient tout aussi bien forcer l'utilisation d'une String finale

Code :
final String s = "AAA";
Sinon faire une erreur de compi.
__________________
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 09/02/2008, 12h36   #92
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
Je ne comprend pas trop cet argument !?

La même chose est possible avec les switch numérique :
Code :
1
2
3
4
5
6
7
8
9
int i = 0;
switch(i) {
      case 0:
        i = 1;
      case 1:
        i = 2;
      default:
        throw new IllegalArgumentException(s);
    }
On ne peut pas interdire une structure seulement car cela permet de faire quelque chose de pas très propre... sinon c'est la fin des langages de programmation


Par contre au niveau des case c'est sûr qu'il faudra obligatoirement une constante...

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 09/02/2008, 15h16   #93
Bollagain
Candidat au titre de Membre du Club
 
Inscription : février 2008
Messages : 13
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 13
Points : 14
Points : 14
Citation:
On ne peut pas interdire une structure seulement car cela permet de faire quelque chose de pas très propre... sinon c'est la fin des langages de programmation
L'arguement est trés juste...

Ma remarque me parait d'ailleurs allé plus dans le sens de quelques bonnes pratiques et n'est pas pertinante pour rejeté la proposition.

Par contre, pour ce qui concerne les valeurs dans le switch, et il prévu que les valeurs du switch soit final ???
Bollagain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2008, 16h02   #94
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 Bollagain Voir le message
Par contre, pour ce qui concerne les valeurs dans le switch, et il prévu que les valeurs du switch soit final ???
Il devrait y avoir les mêmes règles que pour les numériques, donc oui...

Pour rappel les valeur des cases doivent être des constantes :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
	int i = 0;
	int variable = 1;
	final int CONSTANTE = 2;
 
	switch(i) {
		case 0: // OK c'est une constante
			break;
		case CONSTANTE: // OK : C'est une constante
			break;
		case variable: // ERREUR : case expressions must constant expressions
			break;
	}
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 15/02/2008, 09h55   #95
nicorama
Membre Expert
 
Avatar de nicorama
 
Inscription : juillet 2006
Messages : 765
Détails du profil
Informations personnelles :
Âge : 37
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : juillet 2006
Messages : 765
Points : 1 054
Points : 1 054
Citation:
Envoyé par bassim Voir le message
Ca c'est deja faisable enums

c'est vrai qu'un switch avec des Strings DOIT être fait avec des enums !
FYP
__________________
Robusta Web Library : Clients RESTful open source pour Java, Android & GWT.
API Simple et Productive. Avec style.
nicorama est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 10h06   #96
nicorama
Membre Expert
 
Avatar de nicorama
 
Inscription : juillet 2006
Messages : 765
Détails du profil
Informations personnelles :
Âge : 37
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : juillet 2006
Messages : 765
Points : 1 054
Points : 1 054
Citation:
Envoyé par vbrabant Voir le message
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
Bon, j'ai écrit une phrase au-dessus, et me voià avec un argument massue en faveur des switchs de String.
Finalement c'est un peu le même problème qu'avec les JSP où tout passe par les chaines. Dans un contexte métier, utilisons les enums. Dans certains cas, il faut éviter la prolifération de Classes, ou d'Enum. Maintenant, je pense que ton enum NonOui.java pourra être vite rentabilisé :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
public Enum NonOui{
NON(0), OUI(1), JESAISPAS(2);
 
public static Enum getValue(String s){
   if (s.equals("o")||s.equals("oui")) return OUI;
   else return NON;
 
}
 
}
__________________
Robusta Web Library : Clients RESTful open source pour Java, Android & GWT.
API Simple et Productive. Avec style.
nicorama est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 11h55   #97
kisame
Membre régulier
 
Inscription : mars 2005
Messages : 143
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 143
Points : 99
Points : 99
Citation:
On ne peut pas interdire une structure seulement car cela permet de faire quelque chose de pas très propre... sinon c'est la fin des langages de programmation
Pour (pour les mêmes raisons des personnes qui sont pour), puis contre (pour les mêmes raisons des personnes qui sont contre ), puis l'argument de adibuga m'a décidé : pour.

Il est tout à fait possible de faire du code ultracrado avec n'importe quoi.

Les arguments comme quoi on dirait, que faire directement avec un string sans passer par un enum est crade... on pourrait très facilement les retourner contre absolument tous les autres types primitifs du langages qui sont autorisés dans le switch.

je ne vois pas en quoi un
Code :
1
2
3
4
5
6
7
8
9
switch 
{
case 2:
// blabla
break;
 
default :
//blibli
}
est plus propre que
Code :
1
2
3
4
5
6
7
8
9
switch 
{
case "toto":
// blabla
break;
 
default :
//blibli
}
Pas vraiment de moins. Un léger plus. Pour
kisame est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 12h29   #98
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 kisame Voir le message
je ne vois pas en quoi un (...) est plus propre que (...)
A mon sens, le switch est plus propre avec un "enum" car on peut detecter les typos lors de la compilation:

Code java :
1
2
3
4
5
6
7
8
9
10
11
12
enum ANSWER { YES, NO; }

switch (answer) {
case YES: /* ...*/
case NOz: /* ...*/  <---- NOz cannot be resolved or is not a field
}

switch (answer) {
case "YES": /* ...*/
case "NOz": /* ...*/
}
__________________
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 15/02/2008, 13h02   #99
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
A mon sens, le switch est plus propre avec un "enum" car on peut detecter les typos lors de la compilation:
On peut toujours avoir un problème de typo avec des numériques... Faut-il pour autant interdire les switch sur les numériques ?


Attention que ce soit bien clair je ne dis pas que les enum sont une mauvaise solution ! Bien au contraire...

Car en plus de la vérification à la compilation on peut également utilisé l'option -Xlint:fallthrough (ou -Xlint tout court) du compilateur javac pour obtenir un warning lorsqu'un switch sur une enum ne comporte pas toutes les valeurs de l'enum. Pratique car cela permet d'éviter d'oublier une valeur (cela se configure également sur les EDI).


Concrètement dans le cas YES/NO une enum est intéressante car la liste des valeurs est fini, et que l'enum peut apporter pas mal de chose.


Toutefois dans bien des cas on n'a pas forcément besoin d'un tel niveau de vérification, et surtout lorsque le besoin est unique à une méthode, ce qui fait que l'enum perd beaucoup de son intérêt.



Un switch sur des String est à la fois très lisible et rapide à coder.
De plus cela permet d'utiliser des chaines "exotiques" (comprendre : qui contient des caractères non-autorisés dans le nom d'un attribut).


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 15/02/2008, 13h06   #100
kisame
Membre régulier
 
Inscription : mars 2005
Messages : 143
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 143
Points : 99
Points : 99
ouais mais là ça reste de la faute de frappe.

de la même manière

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
switch
{
case 1:
break;
case 2:
break;
case 3:
break;
case 44:    <--- ça passe alors que c'est une faute de frappe.
break;
case 5:
break;
}
ça reste aussi porc et dangereux avec un type primitif.

Sinon oui bien évidement pour le control de type et tout le reste. L'enum reste la meilleure solution je suis d'accord. Je dis juste que je trouve pas ça con d'autoriser les string autant que les types primitifs.
kisame 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 05h55.


 
 
 
 
Partenaires

Hébergement Web