Académique Documents
Professionnel Documents
Culture Documents
I Le pattern “int-enum”.
I Problem(s) ?
2/19
Avant...
I Problem(s) ?
1 public static void decreaseStock(int orange) {
2 switch(orange) {
3 case ORANGE_NAVEL :
4 //...
5 break ;
6 case ORANGE_TEMPLE :
7 //...
8 break ;
9 case ORANGE_SANGUINE :
10 //...
11 break ;
12 default :
13 //...
14 break ;
15 }
16 }
17 public static void main(String[] args) {
18 decreaseStock(POMME_FUJI) ; //compile !
19 System.out.println(POMME_GALA == ORANGE_TEMPLE) ; // ?
20 System.out.println(POMME_GRANNY) ; //affiche 2 :( debuggage pas facile
21 }
3/19
Enums !
4/19
Type énuméré
5/19
Type énuméré
6/19
Type énuméré
6/19
Exemple
1 public enum Option {
2 l, a, v ;
3
4 public static Option getOption(String s) {
5 if (s.length() !=2)
6 return null ;
7 if (s.charAt(0) !=’-’)
8 return null ;
9 return Option.valueOf(s.substring(1)) ;
10 }
11
12 public static void main(String[] args) {
13 for(String s :args) {
14 Option option=getOption(s) ;
15 if (option !=null)
16 System.out.println(option.name()+" "+option.ordinal()) ;
17 }
18 }
19 //java Option -a -v -l
20 // a 1 v 2 l 0
21 }
7/19
Champs
8/19
Constructeurs
I Possible de spécifier un ou plusieurs constructeurs (arguments
entre parenthèses pour l’appeler)
I Parenthèses non obligatoires (constructeur par défaut).
1 public enum Age {
2 jeune, pasIeuv(), mur(40), ^
agé(60), vieux(80), cadavérique(999) ;
3
4 private final int année ; //champ
5
6 Age(int année) { //constructeur
7 this.année=année ;
8 }
9 Age() { //constructeur sans arg (car sinon plus de constructeur par défaut)
10 this(20)
11 }
12 private static Age getAge(int année) {
13 for(Age age :Age.values())
14 if (age.année>=année)
15 return age ;
16 return cadavérique ;
17 }
18 public static void main(String[] args) {
19 System.out.println(getAge(new Scanner(System.in).nextInt())) ;
20 }
21 } 9/19
Enumeration et classe interne
I Interdit de définir une énumération dans une méthode ou une
classe interne non statique.
1 public class Outer {
2 enum Enu1 { //ok
3 toto
4 }
5 class Inner {
6 enum Enu2 {
7 // interdit
8 toto
9 }
10 }
11 void m() {
12 enum Enu3 { // interdit
13 toto
14 }
15 }
16 static class InnerStat {
17 enum Enu4 {
18 toto //ok
19 }
20 }
21 }
11/19
Switch
I Peut être utilisé pour faire un switch.
13/19
Assertion
14/19
(Sans) Assertion : mieux
15/19
Méthodes
I On peut déclarer des méthodes (statiques ou non) dans l’enum.
1 public enum A {
2 a,b ;
3 public int f(int i) {
4 return i+ordinal() ;
5 }
6 public static int g() {
7 //ordinal() pas accessible car statique !
8 return 42 ;
9 }
10
11 public static void main(String[] args) {
12 System.out.println(A.a.f(5)) ;
13 System.out.println(A.b.f(5)) ;
14 System.out.println(A.g()) ;
15 }
16 }
Affiche ?
16/19
Méthodes
I On peut déclarer des méthodes (statiques ou non) dans l’enum.
1 public enum A {
2 a,b ;
3 public int f(int i) {
4 return i+ordinal() ;
5 }
6 public static int g() {
7 //ordinal() pas accessible car statique !
8 return 42 ;
9 }
10
11 public static void main(String[] args) {
12 System.out.println(A.a.f(5)) ;
13 System.out.println(A.b.f(5)) ;
14 System.out.println(A.g()) ;
15 }
16 }
Affiche ?
I 5, 6, 42
16/19
Héritage
17/19
Héritage
I Une enum peut implémenter une ou plusieurs interfaces
18/19
Enum en résumé
I Plus que des entiers : des objets avec des méthodes associées
(ordinal, name...).
I Switch possible dessus.
I Ajout de méthodes, champs possible.
I Enum abstraites et redéfinitions de méthodes.
19/19