BookeldOr (./25) :
Bon, j'ai voulu faire un test avec ça :public class DefineAdt { public enum Adt { CONS0, CONS1, CONS2 } ; public Adt get () { return Adt.CONS2 ; } }public class UseAdt { public static void main (String[] argv) { DefineAdt x = new DefineAdt () ; String value = "NOT SET"; switch (x.get ()) { case CONS0 : value = "CONS0" ; break ; case CONS1 : value = "CONS1" ; break ; } System.out.println ("Got " + value) ; } }
Mais ça compile nickel, sans warning, et affiche simplement "Got NOT SET", y'a des flags à mettre ?benjamin@benjamin-laptop:~/Work/Stuff/java_adt$ java -version java version "1.6.0_03" Java(TM) SE Runtime Environment (build 1.6.0_03-b05) Java HotSpot(TM) Server VM (build 1.6.0_03-b05, mixed mode)
edit : Oh, j'avais mal lu, J2SE5, moi j'ai le 6
En fait ton exemple compile/s'exécute très bien aussi avec le J2SE5 (VM 1.5.0_06) 1
Mon *problème* n'est pas d'être obligé de gérer tous les cas dans le switch (d'ailleurs on n'est effectivement pas obligé), mais simplement que pour le cas où justement toutes les valeurs d'un enum sont traitées explicitement, le code correspondant au default ne pourra jamais (?) être atteint, et que par conséquent c'est débile d'être obligé de le mettre pour que le compilateur considère que la variable value est initialisée dans tous les cas.
Pour moi c'est exactement comme s'il refusait de compiler
int a ; if ( true ) a= 1 ; System.out.println(a) ;
en prétextant que a n'est pas initialisé dans tous les cas, et qu'on soit obligé de ruser en écrivant
int a ; if ( true ) a= 1 ; else throw new AssertionError() ; System.out.println(a) ;
1 Sous eclipse en fait il refuse de compiler parce que toutes les possibilités de l'enum ne sont pas gérées, mais je crois que c'est moi qui l'avait réglé comme ça y'a longtemps... Avec javac ça compile et s'exécute sans difficultés