J'ai un cas où je veux utiliser enums comme touches dans certaines classes de paramètres. La base de données va stocker une valeur de chaîne, nous permettant de changer les constantes enum sans avoir à modifier la base de données (un peu moche, je sais). Je voulais lancer une exception d'exécution dans le constructeur de l'enum comme un moyen de contrôler la longueur de l'argument de chaîne pour éviter de frapper la base de données et ensuite obtenir une violation de contrainte quand je pourrais facilement le détecter moi-même.
public enum GlobalSettingKey {
EXAMPLE("example");
private String value;
private GlobalSettingKey(String value) {
if (value.length() > 200) {
throw new IllegalArgumentException("you can't do that");
}
this.value = value;
}
@Override
public String toString() {
return value;
}
}
Lorsque j'ai créé un test rapide pour cela, je trouve que l'exception jetée était pas la mienne, mais était un ExceptionInInitializerError. Peut-être que c'est stupide, mais je pense que c'est un scénario assez valable pour vouloir lancer une exception dans un initialiseur statique.
Pourquoi voudriez-vous faire cela? Pour moi, cela ressemble à un abus du concept enum. Les valeurs enum sont supposées être des constantes, dont la création ne dépend de rien. Même si techniquement vous pouvez le faire (en jetant une exception non cochée au lieu d'une cochée), je vous suggère de réviser votre design. Si vous essayez d'implémenter un singleton via cette énumération, il est préférable de l'implémenter manuellement comme une classe normale. –
Je suis en train de mettre en place un Singleton, mais comment l'appliquer à la main en tant que classe normale serait-il préférable? Je devrais toujours lancer une exception du code appelé par un initialiseur statique. Vous pouvez lancer des exceptions non contrôlées à partir d'un constructeur enum. – tukushan
Il y a quelque chose * icky * à propos de l'obtention d'une exception simplement en accédant à une valeur enum. Pas si mal quand il s'agit d'une méthode singleton getInstance(). –