Question

Je suis face à un cas d'utilisation où je voudrais déclarer une static finalfield 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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top