163 votes

Quel est l'avantage d'une énumération Java par rapport à une classe avec des champs finaux statiques publics?

Je suis très familier avec le C#, mais de commencer à travailler de plus en Java. Je m'attendais à apprendre que les énumérations en Java ont été essentiellement équivalentes à celles en C#, mais apparemment ce n'est pas le cas. D'abord j'ai été heureux d'apprendre que Java enums peut contenir plusieurs éléments de données qui semble très avantageux (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html). Cependant, depuis lors, j'ai trouvé beaucoup de fonctionnalités manquantes qui sont futiles dans C#, telles que la possibilité d'attribuer facilement une enum élément d'une certaine valeur, et, par conséquent, la capacité de convertir un nombre entier en un enum sans une quantité décente de l'effort (c'est à dire Convertir de valeur entière correspondant Java Enum).

Donc ma question est la suivante: est-il un avantage pour Java enums sur une classe avec un bouquet de public static final champs? Ou est-il juste de fournir plus compact de la syntaxe?

EDIT: Laissez-moi être plus clair. Quel est l'avantage de Java enums sur une classe avec un bouquet de public static final champs de même type? Par exemple, dans les planètes exemple sur le premier lien, quel est l'avantage d'un enum sur une classe avec ces constantes publiques:

public static final Planet MERCURY = new Planet(3.303e+23, 2.4397e6);
public static final Planet VENUS = new Planet(4.869e+24, 6.0518e6);
public static final Planet EARTH = new Planet(5.976e+24, 6.37814e6);
public static final Planet MARS = new Planet(6.421e+23, 3.3972e6);
public static final Planet JUPITER = new Planet(1.9e+27, 7.1492e7);
public static final Planet SATURN = new Planet(5.688e+26, 6.0268e7);
public static final Planet URANUS = new Planet(8.686e+25, 2.5559e7);
public static final Planet NEPTUNE = new Planet(1.024e+26, 2.4746e7);

Aussi loin que je peux dire, casablanca réponse est le seul qui répond à ce.

119voto

EJP Points 113412
  1. Type sécurité et valeur sécurité.
  2. Singleton garanti.
  3. Possibilité de définir des méthodes.
  4. Capacité d'utiliser des valeurs en switch déclaration case des déclarations sans qualification.
  5. Séquentialisation intégrée des valeurs via ordinal().
  6. Sérialisation par nom et non par valeur, ce qui offre un degré de pérennité.
  7. EnumSet et EnumMap classes.

85voto

casablanca Points 41814

Techniquement, on pourrait en effet considérer les énumérations comme une classe avec un groupe de constantes typées, et c’est en fait comment les constantes d’énumations sont implémentées en interne. L'utilisation de enum vous donne toutefois des méthodes utiles ( Enum javadoc ) que vous auriez sinon à mettre en œuvre vous-même, telles que Enum.valueOf .

73voto

Dave Newton Points 93112

Personne n'a mentionné la possibilité de les utiliser dans des déclarations switch ; Je vais ajouter ça aussi.

Cela permet d'utiliser des enums arbitrairement complexes de manière propre sans utiliser les séquences instanceof , potentiellement déroutantes if , ou les valeurs de commutation non-chaîne / int. L'exemple canonique est une machine à états.

47voto

Jim Garrison Points 39523

Le principal avantage est le type de sécurité. Avec un ensemble de constantes, toute valeur du même type intrinsèque peut être utilisée, introduisant des erreurs. Avec un enum, seules les valeurs applicables peuvent être utilisées.

Par exemple

 public static final int SIZE_SMALL  = 1;
public static final int SIZE_MEDIUM = 2;
public static final int SIZE_LARGE  = 3;

public void setSize(int newSize) { ... }

obj.setSize(15); // Compiles but likely to fail later
 

contre

 public enum Size { SMALL, MEDIUM, LARGE };

public void setSize(Size s) { ... }

obj.setSize( ? ); // Can't even express the above example with an enum
 

43voto

Jeffrey Points 22209

Il y a moins de confusion. Prendre en Font par exemple. Il a un constructeur qui prend le nom de l' Font vous le souhaitez, de sa taille et de son style (new Font(String, int, int)). À ce jour, je ne me souviens pas si le style ou la taille va en premier. Si Font avaient utilisé un enum pour l'ensemble de ses différents styles (PLAIN, BOLD, ITALIC, BOLD_ITALIC), son constructeur ressemblerait Font(String, Style, int), à prévenir toute confusion. Malheureusement, enums n'étaient pas là lors de l' Font classe a été créée, et, depuis Java est de maintenir inverse de compatibilité, nous serons toujours tourmenté par cette ambiguïté.

Bien sûr, c'est juste un argument pour l'utilisation de l' enum au lieu de public static final des constantes. Les énumérations sont également parfaits pour les singletons et la mise en œuvre de comportement par défaut, tout en permettant plus tard de personnalisation (I. E. le modèle de stratégie). Un exemple de ce dernier est - java.nio.files' OpenOption et StandardOpenOption: si un développeur a voulu créer sa propre non-standard OpenOption, il pourrait.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X