10 votes

Le champ final peut ne pas avoir été initialisé ou l'avoir déjà été.

Duplicata possible :
Comment gérer un initialisateur de champ final statique qui lève une exception vérifiée ?

Dans cet exemple, j'obtiens l'erreur Le champ final vide myClass peut pas ont été initialisés :

private final static MyClass myClass; // <-- error

static {
    try {
        myClass = new MyClass(); // <-- throws exception
        myClass.init();
    } catch (Exception e) {
        // log
    }
}

Dans cet exemple, j'obtiens l'erreur Le champ final myClass peut déjà ont été attribués :

private final static MyClass myClass;

static {
    try {
        myClass = new MyClass(); // <-- throws exception
        myClass.init();
    } catch (Exception e) {
        myClass = null; // <-- error
        // log
    }
}

Y a-t-il une solution à ce problème ?

14voto

kutschkem Points 1317
private final static MyClass myClass;

static {
    MyClass my;
    try {
        my = new MyClass();
        my.init();
    } catch (Exception e) {
        my = null;
        // log
    }
    myClass = my; //only one assignment!
}

10voto

dystroy Points 145126

Voici une solution :

private final static MyClass myClass = buildInstance();

private static MyClass buildInstance() {
    try {
        MyClass myClass = new MyClass();
        myClass.init();
        return myClass;
    } catch (Exception e) {
        return null;
    }
}

3voto

jbx Points 4063

Si votre classe est finale, elle ne peut pas modifier les valeurs une fois qu'elle est initialisée. Ce que vous faites dans le second extrait, c'est que vous l'assignez d'abord à la classe new MyClass() et ensuite, si une exception est levée dans init() vous le changez ensuite en null .

Ceci n'est pas autorisé. Si new MyClass() ne lève pas d'exception, pourquoi ne pas le mettre à la première ligne ?

Attention toutefois, si init() lève une Exception, vous aurez toujours une instance non initialisée de MyClass . Il ne semble pas que la façon dont vous travaillez avec cette classe corresponde à la façon dont elle est conçue pour fonctionner.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X