Bonjour,
Est-il possible de faire un heritage d' Enum.
Par exemple je souhaiterai faire un heritage de cette enum.
Code:
1
2
3
4
5
6 public enum Test { TOTO, TATA, TITI };
Version imprimable
Bonjour,
Est-il possible de faire un heritage d' Enum.
Par exemple je souhaiterai faire un heritage de cette enum.
Code:
1
2
3
4
5
6 public enum Test { TOTO, TATA, TITI };
non
un type Enum est une classe java avec un constructeur "private". Or tout constructeur d'une classe fille appelle forcément l'un des constructeurs de la classe mère, ce qui est impossible à cause de "private". Il faudrait le passer en "protected" mais alors, cela ne vérifie plus les spécifications du type ENUM.
Il me semble qu'a la place, tu peux définir une interface
Et l'implémenter dans la classe de ton choix, enfin si c'est bien ce que tu cherches.Code:
1
2
3
4
5
6 public interface MesVariables { public final String TOTO= "toto"; public final String TATA= "tata"; public final String TITI= "titi"; }
Malheureusement, non. La raison est que ca va à l'encontre de l'héritage. En effet, le principe de l'héritage est qu'une classe fille peut etre utilisée la ou est utilisée sa mere. Or, dans le cas de l'héritage d'enum, c'est l'inverse. On pourrait utiliser la mere partout ou la fille est utilisée mais pas le contraire...
Bref, dans ce genre de cas, l'usage est d'utiliser un int et de créer une interface pour regrouper les valeurs que peuvent prendre celui-ci (un peut comme la solution de Laine mais avec int au lieu de String).
Techniquement, c'est possible. Mais tu perds les propriétés des enums :
l'enum te permet d'avoir un ensemble limité de valeurs pour un contexte données.
Via ton interface, tu va pouvoir techniquement mélanger des choses qui n'ont aucun rapport entre ellesCode:
1
2
3
4 public enum EtatCellule { VIVANT, MORT; }
Tu perds également la possibilité d'avoir la liste des valeurs possibles pour un même énumCode:
1
2
3
4
5
6 public interface EtatCellule { String VIVANT= "vivant"; String MORT = "mort"; String sansAucunRapport = "salut !"; }
Code:
1
2 EtatCellule.values()
Bonsoir
je sais qu'il perd les propriétés d'enum, je lui ai simplement indiqué une alternative possible :).
C'est vrai. Pour le mimer, un ferait plutôt :
Mais bon, de toute façon, la question est justement de savoir comment ajouter de nouvelles valeurs possibles.Code:
1
2
3
4
5
6 public class EtatCellule { /** Accès limité. */ protected EtatCellule() {} public static final EtatCellule VIVANT = new EtatCellule(); public static final EtatCellule MORT = new EtatCellule(); }
Ca, à partir du moment où on a l'idée "d'étendre" l'enum, c'est inévitable.
Code:
1
2
3 public class EtatCelluleWalkingDead extends EtatCellule { public static final EtatCelluleWalkingDead MORT_VIVANT = new EtatCelluleWalkingDead(); }
Alloooooo quoi :) les mecs reveillez vous personne ne sait qu'on peut:
- Avoir des methodes abstraites définies au niveau de l'enum
- Avoir des attributs définis au niveau de l'enum
- Spécialiser les comportements de chaque instance de l'enum
- Faire que l'enum implémente une interface
- Implémenter le pattern Singleton avec un enum
...
J'ai l'impression que vous essayez de trouver des solutions alternatives avec des choses que vous pouvez bien faire avec des enums.
Bon ok le vrai héritage n'existe pas mais n'empêche qu'on peut deja faire pas mal de choses
Voir:
http://stackoverflow.com/questions/9...er-declaration
http://stackoverflow.com/a/71399/82609
A noter que si vous donnez un état a vos instances d'enum, il faut penser a marquer les variables comme final sans quoi vos enums ne seraient pas immuables (peut être dangereux)
On est au courant, mais rien de tout ça n'est un héritage d'enum. Vu la question posée, il est peu probable que le but soit de faire quelque chose de ce genre.
Possible oui, mais peu probable. Le mieux aurait été de dire pour quoi faire, mais personne n'a demandé et je suis arrivé un peu tard.
Bien vu, c'est surement pour faire un singleton qu'il veut hériter une enum qui ne definie que 3 valeurs. Et moi qui pensais betement qu'il voulait le faire pour etre sur que le pattern Strategie est compatible avec Observable... ;)
Plus sérieusement, quand on veut étendre une enum aussi simple, c'est toujours pour ajouter de nouvelles valeurs. Et ce n'est pas possible.