10
votes

Le champ final peut non / déjà été initialisé

Duplicaté possible:

Comment gérer un initialisateur de champ final statique qui jette une exception vérifiée

Dans cet exemple, je reçois l'erreur le champ final vide MyClass peut pas a été initialisé : xxx

Dans cet exemple, je reçois l'erreur le champ final MyClass peut déjà a été attribué : xxx

là toute solution à ce problème?


3 commentaires

Votre myClass constructeur peut-il lancer une exception? Ou est-ce init () méthode qui peut lancer une exception?


Je pense que c'est la méthode d'initialisation qui peut lancer, non? Parce que dans ce cas, MyClass peut avoir une valeur assignée dans le bloc de capture.


Dit que le constructeur peut également lancer une exception. En fait, c'est un exemple qui illustre la question que j'ai rencontrée avec un autre morceau de code.


3 Réponses :


10
votes

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;
    }
}


1 commentaires

Cela convient parfaitement à mes besoins, merci beaucoup!



3
votes

Si votre classe est finale, il ne peut pas modifier les valeurs une fois qu'elle est initialisée. Ce que vous faites dans le deuxième extrait est que vous l'attribuez d'abord à Nouveau MyClass () , puis si une exception est lancée dans init () Vous le modifiez ensuite. null .

Ceci n'est pas autorisé. Si nouveau myClass () ne jette pas une exception pourquoi ne le mettez-vous pas à la ligne supérieure?

Avertissement cependant, que si init () jette une exception, vous aurez toujours une instance inintitulée de myClass . Il ne semble pas que la façon dont vous travaillez avec cette classe correspond à la manière dont elle conçue pour fonctionner.


0 commentaires

14
votes
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!
}

1 commentaires

Solution intéressante, merci beaucoup!