L'énumération (
Enum ) a été introduite dans
Java 5 et depuis lors, elle est devenue très populaire parmi les développeurs Java. Il est largement utilisé dans diverses applications Java. Étant donné qu'Enum en Java est beaucoup plus polyvalent qu'en C ou C++, il présente également de nombreux cas d'utilisation intéressants, dont vous avez vu quelques-uns dans l'article
10 façons d'utiliser Enum en Java . Mais malgré cette popularité, de nombreux programmeurs Java ignorent encore les fonctionnalités fournies par Enum et les subtilités de l'utilisation d'Enum dans le code Java.
Cela est devenu clair lorsque plusieurs lecteurs ont demandé, par exemple,
la capacité d'Enum à implémenter une interface en Java ou
pourquoi nous ne pouvons pas instancier Enums en dehors d'Enum , notant qu'ils avaient été interrogés à ce sujet lors d'une interview. Cela nous a inspiré à compiler
une liste de questions fréquemment posées dans Java Enum qui vous aident non seulement à réussir les entretiens, mais ouvrent également de nouvelles voies d'apprentissage. Comme indiqué précédemment, les questions d'entretien vous obligent souvent à prendre le sujet plus au sérieux, ce qui n'est pas une mauvaise chose, et étant donné la puissance et l'utilité d'Enum, il est temps que vous deveniez un maître de l'énumération. Vous trouverez ci-dessous une liste de questions basées sur diverses fonctionnalités et propriétés d'Enum. Vous pouvez l’utiliser comme matériel préparatoire à un entretien ou simplement comme guide de dénombrement. Si vous êtes nouveau sur Java, vous apprendrez beaucoup de choses nouvelles et utiles sur Enum.
1) Enum peut-il implémenter une interface en Java ? Oui,
Enum peut hériter des interfaces . Étant donné que le type Enum est similaire à
une classe et
à une interface , il peut hériter d'une interface. Cela donne une flexibilité incroyable dans l'utilisation d'Enum comme implémentation personnalisée dans certains cas.
Voici un bon exemple d'utilisation d'Enum à ce titre.
2) Enum peut-il hériter (étendre) de la classe ? Non il ne peut pas! Inattendu, puisqu'il a été dit précédemment que le type Enum est similaire à une classe ou une interface en Java. Eh bien, c’est la principale raison pour laquelle cette question est posée juste après la précédente. Puisque
Enum hérite déjà de la classe abstraite
java.lang.Enum , il est clair qu'une autre classe ne pourra pas hériter puisque Java ne prend pas en charge l'héritage de plusieurs classes. En héritant de
java.lang.Enum , toutes les énumérations ont des méthodes
ordinal() ,
values() ou
valueOf() .
3) Comment créer un Enum sans instances d'objet ? Est-ce possible sans erreur de compilation ? C’est l’une de ces
questions délicates que les intervieweurs adorent. Puisqu'un Enum est vu comme une collection d'un certain nombre d'objets, comme
les jours de la semaine ou
les mois de l'année, obtenir
un Enum sans rien semble suspect. Mais oui, vous
pouvez créer un Enum sans instances , par exemple en créant une classe utilitaire. C'est une autre façon innovante d'utiliser Enum :
public enum MessageUtil{ ; // required to avoid compiler error, also signifies no instance public static boolean isValid() { throw new UnsupportedOperationException("Not supported yet."); } }
4) Pouvons-nous remplacer la méthode toString() pour Enum ? Que se passe-t-il si nous ne redéfinissons pas ? Bien sûr, vous pouvez remplacer la méthode
toString() d'Enum , comme vous pouvez remplacer n'importe quelle classe qui hérite
de java.lang.Object et dispose d'une méthode
toString() disponible, et même si vous ne le faites pas, vous ne perdrez rien car le résumé La base de la classe Enum fera cela pour vous et renverra le nom, qui est le nom de l'instance Enum. Voici le code de la méthode
toString() de la classe Enum :
public String toString() { return name; }
le nom est spécifié lorsque le compilateur alloue du code pour créer une énumération en réponse à la création d'une instance dans la classe Enum elle-même, ainsi qu'à la création d'un ordinal dans le constructeur à partir du Classe
java.lang.Enum :
protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; }
C'est
le seul constructeur permettant de créer enum , qui est appelé par le compilateur en réponse à la déclaration d'Enum dans le programme.
5) Pouvons-nous instancier un Enum en dehors d’un Enum ? Pourquoi pas? Vous
ne pouvez pas instancier un Enum en dehors des limites d'un Enum car Enum n'a pas
de publicconstructeur, et le compilateur ne vous permettra pas d'introduire un tel constructeur. Étant donné que le compilateur génère la plupart du code en réponse à la déclaration de type Enum, il n'autorise pas les constructeurs
publics dans Enums, ce qui oblige les instances Enum à être déclarées en interne.
6) Pouvons-nous spécifier un constructeur à l’intérieur d’un Enum ? Cette question suit souvent la précédente. Oui, vous pouvez, mais rappelez-vous que cela n'est possible qu'avec des constructeurs
privés ou
privés de packages . Les constructeurs avec
public et
protected ne sont pas autorisés dans Enum. Ici vous pouvez voir
un exemple.
7) Quelle est la différence entre comparer Enum en utilisant la méthode == ou equals() ? Il s'agit d'une question très vaste et délicate qui est traitée en détail
ici .
8) Que fait la méthode ordinal() dans Enum ? La méthode
ordinal() renvoie l'ordre dans lequel les instances Enum sont désignées dans Enum. Par exemple, dans
DayOfWeek Enum, vous pouvez spécifier les jours dans l'ordre :
public enum DayOfWeek{ MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; }
et si nous appelons
la méthode DayOfWeek.MONDAY.ordinal() , elle renverra 0 - ce qui signifie la première instance. Cette méthode est très utile pour mettre de l'ordre en fonction de l'état actuel des choses : c'est-à-dire pour indiquer que
MARDI (mardi) vient après
LUNDI (lundi) et avant
MERCREDI (mercredi). De même, vous pouvez utiliser une énumération pour représenter les mois de l’année, où février vient après janvier mais avant mars. Toutes les énumérations personnalisées héritent de cette méthode de la classe abstraite
java.lang.Enum , et elles sont définies par le compilateur en appelant le constructeur
protégé sur
java.lang.Enum , qui prend un nom et un ordinal.
9) Est-il possible d'utiliser Enum avec TreeSet ou TreeMap en Java ? C'est une question Enum vraiment intéressante, et que les gens aiment poser pour tester leurs connaissances approfondies. Jusqu'à ce que vous regardiez le code
java.lang.Enum , vous ne saurez probablement pas
qu'Enum hérite de l'interface Comparable , qui est une condition essentielle pour une utilisation dans des collections ordonnées comme
TreeSet et
TreeMap .
Puisque Enum hérite de l'interface Comparable par défaut , elle peut être utilisée avec
TreeSet et
TreeMap .
10) Quelle est la différence entre ordinal() et compareTo() dans Enum ? Cela découle directement de la question précédente : en fait,
compareTo() simule l'ordre fourni par la méthode
ordinal() , qui est l'ordre naturel d'Enum. En bref, Enum restreint les comparaisons dans l'ordre dans lequel elles sont déclarées. Il convient également de rappeler que ces constantes ne sont comparables qu'à d'autres constantes du même type - la comparaison de différents types de constantes peut entraîner une erreur du compilateur.
11) Est-il possible d'utiliser Enum dans un boîtier de commutation ? Oui, vous pouvez. De plus, c’est l’un des principaux avantages de l’utilisation d’Enum. Étant donné que les instances Enum se compilent en une constante temporaire, vous pouvez les injecter en toute sécurité dans
case et switch . Voici un exemple de code avec les jours de la semaine :
public void developerState(DayOfWeek today){ switch(today){ case MONDAY: System.out.println("Hmmmmmmmm"); break; case TUESDAY: System.out.println("Hmmmm"); break; case FRIDAY : System.out.println("Yeahhhhhh"); break; } }
Enum et Switch se complètent bien, surtout si Enum contient un petit nombre de constantes stables, par exemple sept jours de la semaine, 12 mois de l'année, etc. Regardez d'autres exemples d'utilisation
de swith case avec Enum .
12) Comment parcourir une instance Enum entière ? Si vous avez ouvert
java.lang.Enum , vous savez que
la méthode values() renvoie un tableau de toutes les constantes Enum. Puisque chaque énumération hérite
de java.lang.Enum , ils ont une méthode
values() . En l'utilisant, vous pouvez parcourir toutes les constantes d'une énumération d'un certain type. Regardez
des exemples de cela avec une boucle
foreach et la méthode
values() .
13) Quels sont les avantages et les inconvénients de l’utilisation d’Enum comme singleton ? Enum fournit
un raccourci rapide pour implémenter le modèle singleton, et comme il est même couvert dans le livre Effective Java, c'est un choix populaire. À première vue, le singleton Enum est prometteur et assez pratique, car il contrôle l'instanciation, est sérialisable en toute sécurité et, surtout, il est facile de créer un singleton thread-safe à l'aide d'Enum. Vous n’avez plus à vous soucier de vérifier la volatilité des variables. En savoir plus sur les avantages et les inconvénients de l'utilisation de cette approche
ici .
14) Quel est l'avantage d'utiliser Enum au lieu des modèles d'énumération int et String ? Si vous programmez depuis plus de 5 ans et que vous êtes toujours dans JDK 1.3 ou 1.4, vous serez familier avec les
modèles d'énumération String et int , qui utilisent
un préfixe de constante finale statique publique pour représenter une collection de constantes fixes bien connues. un certain nombre de choses, comme
les jours de la semaine . Il y a ici de nombreux problèmes : vous n'avez pas d'indépendance du type Enum, puisque la variable
String responsable du jour de la semaine peut prendre n'importe quelle valeur arbitraire.
De même, un int énumérable peut prendre n'importe quelle valeur, et le compilateur l'avalera volontiers. Et en utilisant
Enum , vous obtenez la sécurité de type que le compilateur vérifie pour vous. Il y a quelques réflexions intéressantes sur ce sujet dans Effective Java, dont la lecture est recommandée à tous les développeurs Java.
15) Comment convertir une chaîne en une énumération ? C'est une question quotidienne qui se pose en raison de la popularité de l'utilisation
de String et
Enum dans le développement d'applications Java. La meilleure façon de convertir
un Enum en String est de définir une méthode d'usine sur Enum lui-même qui prendra les arguments
String et les renverra sous forme
de Enum . Vous souhaiterez peut-être également ignorer la casse. Voici quelques
exemples de transformation de chaînes en énumérations. Cela nous amène à la fin de notre liste de 15 questions (
et réponses ) sur Enum.
Mais n’oubliez pas :
lire ne suffit pas pour apprendre, ce n’est que la première étape . Pour bénéficier des énumérations, essayez de trouver où vous pouvez utiliser Enum dans votre projet - cela vous donnera une expérience du monde réel, et avec cette expérience, vous apprendrez plus que des exemples, car vous rencontrerez plus de problèmes que vous pourrez gérer plus facilement. des moyens complexes et détaillés. Ces
questions sur Enum méritent d'être prises en compte pour tester vos connaissances, surtout si vous êtes pressé pour un entretien et que vous n'avez tout simplement pas le temps pour une immersion détaillée dans l'univers Enum.
GO TO FULL VERSION