Comment gérer un initialiseur de champ final statique qui émet une exception vérifiée
-
18-09-2019 - |
Question
Je suis face à un cas d'utilisation où je voudrais déclarer une static final
field avec une déclaration initialiseur qui est déclarée à jeter une exception vérifiée. En règle générale, il serait ressembler à ceci:
public static final ObjectName OBJECT_NAME = new ObjectName("foo:type=bar");
La question que j'ai ici est que le constructeur de ObjectName
peut lancer plusieurs exceptions vérifiées, que je ne me soucie pas (parce que je sais que mon nom est valide, et il est Allright si elle se bloque lamentablement dans le cas où ce n'est pas). Le compilateur java ne me laisse pas ignorer tout cela (car il est une exception vérifiée), et je préférerais ne pas recourir à:
public static final ObjectName OBJECT_NAME; static{ try{ OBJECT_NAME = new ObjectName("foo:type=bar"); }catch(final Exception ex){ throw new RuntimeException("Failed to create ObjectName instance in static block.",ex); } }
Parce que les blocs statiques sont vraiment, à lire vraiment difficile. Quelqu'un at-il une suggestion sur la façon de traiter ce cas dans une belle manière propre?
La solution
Si vous ne voulez pas des blocs statiques (certaines personnes ne le font pas) alors une alternative est d'utiliser une méthode statique. IIRC, Josh Bloch a recommandé cet (apparemment pas efficace Java sur l'inspection rapide).
public static final ObjectName OBJECT_NAME = createObjectName("foo:type=bar");
private static ObjectName createObjectName(final String name) {
try {
return new ObjectName(name);
} catch (final SomeException exc) {
throw new Error(exc);
}
}
Ou:
public static final ObjectName OBJECT_NAME = createObjectName();
private static ObjectName createObjectName() {
try {
return new ObjectName("foo:type=bar");
} catch (final SomeException exc) {
throw new Error(exc);
}
}
(Modifié:. Corrigé deuxième exemple de procédé pour retourner au lieu d'attribuer la static
)
Autres conseils
Votre code est parfaitement valide. Je ne trouve pas difficile à lire. D'autres moyens ne feraient que rendre plus pire. Ils sont seulement difficiles à lire pour commencer, parce que la plupart d'entre eux ne sont pas au courant. Il suffit de suivre les conventions standards en matière de classement des éléments dans le code. Par exemple. à mi-chemin ne soit au fond tout le code et aussi ne pas avoir pas mis initialiseurs statiques multiple de les répartir sur la classe. Il suffit de mettre un en haut, après des déclarations statiques.
blocs de static
ne sont pas difficiles à lire. Donc, je vous recommande cette solution.
Cependant, vous pouvez envelopper votre objet dans un autre objet, par exemple
ObjectNameWrapper
qui partage un interface
avec votre ObjectName
, et dont le constructeur appelle le constructeur de votre ObjectName
, cachant toutes les exceptions vérifiées qui se produisent. Mais encore une fois, je vais pour l'option statique.