On va encore dire que je suis pédant mais.... je ne suis pas d'accord:
Une classe de type enum est implicitement final, c'est pourquoi elle ne peut pas être définie comme abstract.
C'est faux. Une enum peux être abstract, mais c'est implicite, on ne peux pas l'expliciter. Une enum peut ne pas être final.
Les règles sont ici:
http://docs.oracle.com/javase/specs/...8.html#jls-8.9
Les types Enum ne doivent pas êter déclarés abstrait, le faire entraient une erreur de compilation.
Une enum est implicitement final SAUF si au moins une des constantes contient un corps de classe
autrement dit, cette enum n'est pas final:
1 2 3 4 5
| public enum SomeEnum {
UN,
DEUX{};
} |
Du coup, ceci est faux aussi
D'après la première règle, on ne peut pas étendre les classes de type enum.
On peux créer un type anonyme qui étends l'enum, c'est exactement ce que j'ai fais dans le code précédent.
D'ailleurs, tout ça, tu le fais dans ce point-ci ou tu montre une enum non final et abstraite avec des sous classes anonymes
Il est possible de déclarer une méthode abstraite dans une classe de type enum, dans ce cas, chaque énumération devrait fournir une implémentation de la méthode sinon une erreur va se produire à la compilation.
Petit code de démo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| public enum MyEnum {
UN{public void test(){System.out.println("1");}},
DEUX{public void test(){System.out.println("deux");}};
public abstract void test();
}
public enum MyLastEnum {
UN{public void test(){System.out.println("1");}},
DEUX{public void test(){System.out.println("deux");}};
public void test(){System.out.println("default");};
}
public enum MyOtherEnum {
UN,
DEUX;
}
public static void main(String[] args) {
for (MyEnum e : MyEnum.values()){
System.out.printf("Class is %s and parent is %s and super parent is %s\n",
e.getClass().getName(),
e.getClass().getSuperclass().getName(),
e.getClass().getSuperclass().getSuperclass().getName());
}
System.out.println("MyEnum modifiers: "+Modifier.toString(MyEnum.class.getModifiers()));
for (MyOtherEnum e : MyOtherEnum.values()){
System.out.printf("Class is %s and parent is %s and super parent is %s\n",
e.getClass().getName(),
e.getClass().getSuperclass().getName(),
e.getClass().getSuperclass().getSuperclass().getName());
}
System.out.println("MyOtherEnum modifiers: "+Modifier.toString(MyOtherEnum.class.getModifiers()));
for (MyLastEnum e : MyLastEnum.values()){
System.out.printf("Class is %s and parent is %s and super parent is %s\n",
e.getClass().getName(),
e.getClass().getSuperclass().getName(),
e.getClass().getSuperclass().getSuperclass().getName());
}
System.out.println("MyLastEnum modifiers: "+Modifier.toString(MyLastEnum.class.getModifiers()));
} |
Et sa sortie
1 2 3 4 5 6 7 8 9
| Class is testenums.MyEnum$1 and parent is testenums.MyEnum and super parent is java.lang.Enum
Class is testenums.MyEnum$2 and parent is testenums.MyEnum and super parent is java.lang.Enum
MyEnum modifiers: public abstract
Class is testenums.MyOtherEnum and parent is java.lang.Enum and super parent is java.lang.Object
Class is testenums.MyOtherEnum and parent is java.lang.Enum and super parent is java.lang.Object
MyOtherEnum modifiers: public final
Class is testenums.MyLastEnum$1 and parent is testenums.MyLastEnum and super parent is java.lang.Enum
Class is testenums.MyLastEnum$2 and parent is testenums.MyLastEnum and super parent is java.lang.Enum
MyLastEnum modifiers: public |
0 |
0 |