Forcer l'Initialisation d'un type énuméré en Java
J'essaie de trouver un moyen de forcer Java pour charger/initialisation d'un type énuméré (qui est imbriquée à l'intérieur d'une classe qui contient une Carte statique).
C'est important pour moi parce que le type énuméré est un constructeur qui remplit ladite carte, et sans manière explicite à initialiser cette enum, la carte restera vide. J'ai tenté d'utiliser Class.forName
, mais cela ne semble pas fonctionner.
Je suppose que je pourrais créer une instance de la enum (et de le stocker dans un certain autre collection ou quelque chose), mais je voudrais savoir si il est une manière élégante de le faire.
Si vous n'êtes pas garanti l'enum sera construit avant vous avez besoin d'utiliser la carte, vous pourriez vouloir reconsidérer votre conception ici, bien que Matt recommandation de l'utilisation d'un initialiseur statique sera probablement que vous obtenez ce que vous voulez.
Ce thread stackoverflow.com/questions/3798083/3800434#3800434 touche sur le sujet.
Fondamentalement, je vois une exception indiquant que la classe est "invalide", et je sais pour sûr que j'ai le bon chemin d'accès au package. est Classe.forName() censés sur les énumérations dans tous les cas?
Ce thread stackoverflow.com/questions/3798083/3800434#3800434 touche sur le sujet.
Class.forName
ne initialiser une classe. Si elle "se complique pas de travail", vous code a d'autres problèmes, vous ne réalisez pas. Pourquoi ne pas poster votre code.Fondamentalement, je vois une exception indiquant que la classe est "invalide", et je sais pour sûr que j'ai le bon chemin d'accès au package. est Classe.forName() censés sur les énumérations dans tous les cas?
OriginalL'auteur Ryan Delucchi | 2010-09-29
Vous devez vous connecter pour publier un commentaire.
Une classe est chargée lorsque vous faites référence à une classe. Cela fonctionne de la même pour toutes les classes.
Le problème que vous avez est plus probable qu'une valeur d'Enum est initialisé avant tout statique bloc. c'est à dire que vous ne peut pas se référer à quelque chose d'initialisation dans un bloc statique dans un constructeur. (Généralement de l'initialisation du contenu statique dans un constructeur est une MAUVAISE idée), Vous devez initialiser la Carte dans le bloc statique, pas le constructeur.
Essayer
Btw +1 à trashgod comme il l'a souligné un exemple qui utilise cette même approche.
Il a travaillé. Et je suis d'accord avec votre affirmation que "initialisation de contenu statique dans un constructeur est une MAUVAISE idée". Je suis allé de l'avant avec cette approche.
Probablement que je vais utiliser ImmutableMap dans la Goyave ou de Collections.unmodifiableMap d'empêcher toute possibilité d'élément de plus dans la carte de terrain qui n'est pas réellement défini dans EnumTest.
OriginalL'auteur Peter Lawrey
Ne peut pas juste mettre de l'initialisation de la carte dans la statique de l'initialiseur de type Enum?
EDIT: Il semble que le problème a été que le membre Enum définitions doivent venir en premier. Je suppose que j'ai juste parcouru rapidement ce. Je fixe l'exemple.
Alors pouvez-vous nous en dire un peu plus? Ce problème, c'est que cela provoque? Comment pouvez-vous accéder à la carte avant de l'Enum est initialisé si l'Enum ne l'initialisation? Est la carte n'est PAS incluse dans l'Enum?
correct. La carte n'est pas contenue dans l'enum. Et je ne peux pas mettre la carte dans l'enum parce que Java ne permet pas un enum constructeur pour remplir une statique de la collection qui est à l'intérieur d'un enum.
+1 Il y a un bel exemple dans JLS 8.9, sous
enum Color
" java.sun.com/docs/books/jls/third_edition/html/classes.html#8.9Quel est le but de la carte, alors? J'ai écrit des enums en interne avec des cartes statiques avant; je suppose que je voudrais savoir ce que vous essayez d'accomplir.
OriginalL'auteur Matt H
Vous pouvez simplement référence à quelque chose dans l'énumération de la classe. Par exemple:
Je suis assez certain qu'il ne peut pas être complètement optimisé précisément en raison du fait qu'il peut potentiellement entraîner une initialisation de classe. Java laisse beaucoup moins de "undefined" que C ou C++, pour le meilleur ou pour le pire.
OriginalL'auteur Laurence Gonsalves
Semble que ce est exactement pourquoi il est souvent recommandé d'utiliser les méthodes d'accès au lieu de directement référencement des membres. Votre problème est que le code permet d'accéder à la carte avant qu'il est initialisé. Bloquer l'accès arbitraire de la carte, et de le cacher derrière un accesseur méthode qui permet de s'assurer qu'il est initialisé.
OriginalL'auteur Dave Costa