Les problèmes de l'initialisation d'une variable finale en Java

Je continuer à courir dans de légères variations d'un problème en Java et il commence à faire de moi, et je ne peux pas vraiment penser à un bon moyen de les contourner.

J'ai une propriété de l'objet, qui est définitive, mais dynamique. C'est, je veux la valeur de la constante une fois affecté, mais la valeur peut être différente à chaque exécution. Donc, je déclare la classe de niveau variable au début de la classe - dire private final FILE_NAME;. Ensuite, dans le constructeur, je lui assigner une valeur - dire FILE_NAME = buildFileName();

Le problème commence quand j'ai le code dans le buildFileName() méthode lève une exception. J'ai donc essayer quelque chose comme cela dans le constructeur:

try{
   FILE_NAME = buildFileName();
}
catch(Exception e){
   ...
   System.exit(1);
}

Maintenant, j'ai une erreur "Le vide final le champ nom de fichier peut ne pas avoir été initialisé." C'est là que je commence à être un peu agacé à Java strict du compilateur. Je sais que ce ne sera pas un problème parce que si il arrive à l'attraper le programme va fermer... Mais le compilateur ne sait pas qui et donc ne pas permettre à ce code. Si j'essaie d'ajouter un mannequin affectation à la pêche, je get - "Le dernier champ FILE_NAME peut-être déjà été assigné." J'ai clairement ne peut pas affecter une valeur par défaut avant le try-catch parce que je ne peut l'attribuer à la fois.

Des idées...?

  • Tu veux dire private static final FILE_NAME;?
  • Hawtin - pas. Pourquoi devrait-il être statique?
  • Je suis d'accord avec Ryan réponse (et voté de façon appropriée). Une chose que je vais dire est... voulez-vous vraiment le Système.quitter si vous ne pouvez pas initialiser? Peut-être la meilleure idée est de les laisser à l'exception obtenir jeté de toute façon si elle n'est pas traitée, vous aurez encore sortie, mais si il y a un mécanisme de gestion en place, il peut être pris en charge correctement.
  • parce que ALL_CAPS indique constantes (un.k.un. static final): java.sun.com/docs/codeconv/html/CodeConventions.doc8.html#367
  • Sauer - c'est une constante, mais c'est un objet de niveau constant... chaque objet peut avoir son propre nom de fichier, mais une fois mis, il ne peut pas être changé.
  • exactement. Et au moins le soleil convention de nommage dit que "les variables déclarées des constantes de classe" doit être nommé avec ALL_CAPS. D'autres domaines, même si final, devrait être camelCase avec un bas de cas du caractère de départ.

InformationsquelleAutor froadie | 2010-05-05