Comment initialiser Java enum basé Singleton?
Quelle est la bonne façon d'initialiser enum de java à base de singleton, si je dois l'initialiser avant que je puisse utiliser l'objet.
J'ai commencé à écrire du code , mais je ne suis pas sûr si je suis en train de faire. Pourriez-vous m'aider à mettre en œuvre ce singleton correct pour moi?
public enum BitCheck {
INSTANCE;
private static HashMap<String, String> props = null;
public synchronized void initialize(HashMap<String, String> properties) {
if(props == null) {
props = properties;
}
}
public boolean isAenabled(){
return "Y".equalsIgnoreCase(props.get("A_ENABLED"));
}
public boolean isBenabled(){
return "Y".equalsIgnoreCase(props.get("B_ENABLED"));
}
}
source d'informationauteur java_mouse
Vous devez vous connecter pour publier un commentaire.
Il est parfaitement possible de créer constructeur de
enum
:Noter que:
props
champ peut être définitive (nous aimonsfinal
)props
n'a pas à êtrestatic
Attention à ce dernier point. Depuis
enum
-singletons sont créés avec impatience lors de laenum BitCheck
classe est chargée, vous n'avez aucun moyen de passer des arguments au constructeur. Bien sûr, vous pouvez par le biais deINSTANCE
déclaration:mais cela ne fait aucune différence, non? Que voulez-vous atteindre? Peut-être que vous avez réellement besoin paresseux-initialisé singleton?
Vous avez juste à les initialiser dans la déclaration.
Vous devez définir un constructeur comme ceci:
Un très bon exemple est la Planète enum: http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
Vous devez mettre en œuvre des interfaces et donc de changement:
Vous pouvez regarder Quelle est la meilleure approche pour l'aide d'un Enum comme un singleton en Java? qui est similaire à ce que vous voulez.
Vous pouvez essayer quelque chose comme cela dans votre Enum en fonction de singleton code. Cela permettra de s'assurer que le Singleton peut être initialisé qu'une seule fois.
REMARQUE: Pour plus d'initialisation complexe, vous avez besoin de 2 AtomicBooleans pour initStarted et initCompleted (au lieu d'une seule AtomicBoolean - isInitialized). Alors que le premier thread jeux de initStarted et exécute les étapes d'initialisation, le reste d'attendre jusqu'à ce que initCompleted est définie sur true par le premier thread.