Qu'est-ce qu'une enum?
L'énumération est une nouvelle fonctionnalité introduite par JDK5. Dans certains cas, un objet d'une classe est fixé et peut être défini comme une énumération. Dans une utilisation réelle, les types d'énumération peuvent également être utilisés comme spécification pour assurer la sécurité des paramètres du programme. L'énumération a les caractéristiques suivantes:
java.lang.Enum en Java par défaut, et implémente deux interfaces: java.lang.Seriablizable et java.lang.Comparable .public static final et les classes d'énumération non abstraites ne peuvent pas dériver des sous-classes. Voici equals() dans java.lang.Enum :
// Ceci est final modifié, et les sous-classes ne sont pas autorisées à réécrire des égaux booléens finaux publics (objet autre) {renvoie ce == autre;} Méthodes courantes d'énumération
int compareTo(E o)
Comparez l'ordre de cette enum avec l'objet spécifié. Lorsque l'objet est inférieur à, égal ou supérieur à l'objet spécifié, des entiers négatifs, des entiers zéro ou positifs sont renvoyés respectivement. Les constantes d'énumération ne peuvent être comparées qu'avec d'autres constantes de dénombrement du même type d'énumération.
// Code source dans ENUM PUBLIC PUBLIC FINAL INT RÉCOMPETO (E O) {ENUM AUTRE = (ENUM) O; Enum self = this; if (self.getClass ()! = autre.getClass () && // Optimization self.getDeclaringClass ()! = autre.GetDeclaringClass ()) Throw new classCastException (); return self.OrDinal - Autre.Ordial;} String name()
Renvoie le nom de cette instance d'énumération.
static values()
Renvoie un tableau contenant toutes les valeurs d'énumération qui peuvent être utilisées pour parcourir toutes les valeurs d'énumération.
String toString()
Renvoie le nom de cette instance d'énumération, c'est-à-dire la valeur d'énumération. Identique à name() .
// name () et toString () dans enum public String toString () {return name;} public final string name () {return name;} int ordinal()
Renvoie la valeur d'index de la valeur d'énumération dans la classe Enum (à partir de 0), c'est-à-dire l'ordre de la valeur d'énumération dans la déclaration d'énumération, qui dépend de l'ordre de la déclaration de valeur d'énumération.
<T extends Enum<T>> valueOf()
Renvoie une constante d'énumération du type d'énumération spécifié avec le nom spécifié, le nom doit correspondre exactement à l'identifiant utilisé pour déclarer la constante d'énumération dans ce type (les caractères des espaces supplémentaires ne sont pas autorisés). Cette méthode correspond à TOSTRING, donc si nous dépassons toString() , nous devons remplacer valueOf() (nous pouvons remplacer toString() , mais nous ne pouvons pas remplacer valueOf() par nous-mêmes. Lorsque nous allons l'emporter sur toString() , valueOf() sera réécrite automatiquement, et que nous n'avons pas besoin de l'attention.
Application de l'énumération
L'énumération est un type spécial, et son utilisation est très similaire à celle des classes ordinaires.
Remplacer un ensemble de constantes
Couleur de l'énumération publique {rouge, vert, vierge, jaune} Utilisé dans les instructions de commutation
// Switch a ajouté la prise en charge de l'énumération dans JDK1.6 Signal Enum {vert, jaune, rouge} ... Switch (Color) {Case Red: Color = Signal.Green; casser; } ... Ajouter des méthodes à l'énumération
Couleur de l'énumération publique {rouge ("rouge"), vert ("vert"), vierge ("blanc"), yello ("jaune"); // Nom de chaîne privée variable de membre; // Constructeur Private Color (String Name) {this.name = name; } // get set Method public String getName () {return name; } public void setName (string name) {this.name = name; }} Implémenter l'interface
Comportement de l'interface publique {void print (); } La couleur de l'énumération publique implémente le comportement {rouge ("rouge", 1), vert ("vert", 2), vierge ("blanc", 3), yello ("jaune", 4); // Méthode d'interface @Override public void print () {System.out.println (this.index + ":" + this.name); }} Classe d'énumération contenant des méthodes abstraites
Fonctionnement de l'énumération publique {// Utilisé pour effectuer des opérations d'addition plus {// La partie des accolades est en fait une sous-classe interne anonyme @Override public double calcul (double x, double y) {return x + y; }}, // Utilisé pour effectuer des opérations de soumission moins {// La partie des accolades est en fait une sous-classe interne anonyme @Override public double calcul (double x, double y) {// TODO Méthode générée automatique Stub Retour x - y; }}, // Utilisé pour effectuer des temps d'opérations de multiplication {// La partie des accolades est en fait une sous-classe interne anonyme @Override public double calcul (double x, double y) {return x * y; }}, // Utilisé pour effectuer la division de division Divide {// La partie Burly Braces est en fait une sous-classe interne anonyme @Override public double calcul (double x, double y) {return x / y; }}; // Définissez une méthode abstraite pour cette classe d'énumération. Toutes les valeurs d'énumération dans la classe d'énumération doivent implémenter cette méthode abstraite publique Double calcul (double x, double y);} Mise en œuvre des singletons avec des énumérations (meilleures pratiques pour les singletons)
avantage:
1. Utilisez les caractéristiques de l'énumération pour mettre en œuvre des cas uniques
2. Le JVM assure la sécurité du fil
3. Les attaques de sérialisation et de réflexion ont été résolues par énumération
Public Enum Singleton {instance; public singleton getInstance () {// ajouter cette méthode pour permettre aux autres de comprendre comment l'utiliser, car cette méthode d'implémentation est relativement rare. retour d'instance; }} Autre utilisation de l'énumération
Énum
range(E from, E to)
Obtenez une gamme de définies à partir de la valeur d'énumération.
pour (Weekdayenum Day: enumset.range (WeekdayEnum.mon, WeekdayEnum.fri)) {System.out.println (Day); } of(E first, E... rest)
Crée un ensemble d'énumération qui contient à l'origine les éléments spécifiés.
noneOf(Class<E> elementType)
Crée un ensemble d'énumération vide avec le type d'élément spécifié.
Attaquer
EnumMap(Class<K> keyType)
Crée une carte d'énumération vide avec le type de clé spécifié.
Map <weather, string> entummap = new enummap <weather, string> (weather.class); edummap.put (Weather.sunny, "Sunny"); edummap.put (Weather.rainy, "Rainy");
Énumération dans Android
Enum doit occuper une grande quantité de mémoire. S'il est sensible à la mémoire, veuillez essayer d'utiliser le moins possible enum et le remplacer par une constante statique.
Cependant, si vous n'utilisez pas d'énumération, certains risques de sécurité surviendront, donc le responsable a lancé deux annotations, qui peuvent être vérifiées pendant la période de compilation pour remplacer l'énumération. Ces deux annotations sont: @intdef et @StringDef. Situé dans Compile 'com.android.Support:Support-Annotations:+'.
Exemple d'utilisation
L'utilisation de @StringDef est cohérente avec @intdef. Ici, nous prenons @intdef à titre d'exemple.
interface publique qrCodeType {int weChat = 0; int Alipay = 1; @IntDef ({wechat, alipay}) @retention (retentionPolicy.source) @target ({elementType.field, elementType.Method, elementType.Parameter}) @Interface Checker {}} public class qrcode {@ qrcodetype.checker // define dans l'attribut private; public void setType (@ qrcodetype.checker int type) {// définir dans le paramètre this.type = type; } @ Qrcodetype.checker // définir dans la méthode (c'est-à-dire vérifier le type de valeur de retour) public int getType () {return type; }} Recommandations pour une utilisation
La plage de développement la plus utilisée consiste à utiliser des énumérations au lieu d'un ensemble de constantes statiques. Dans ce cas, la méthode d'annotation ci-dessus peut être utilisée à la place.
Lorsqu'une énumération contient également d'autres fonctions (telles que: y compris d'autres méthodes définies), il ne peut pas être remplacé.
Résumer
Ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article sera d'une aide à votre étude ou à votre travail. Si vous avez des questions, vous pouvez laisser un message pour communiquer.