Java Peut variables final être initialisée dans le bloc d'initialisation statique?
Basé sur ma connaissance du langage Java, les variables peuvent être initialisées dans static initialization block
.
Cependant, lorsque j'essaie de mettre en pratique (static
variables qui sont final
trop), je reçois le message d'erreur indiqué dans la capture d'écran ci-dessous:
Vous devez vous connecter pour publier un commentaire.
Oui, bien sûr:
static final
variables peuvent être initialisées dans un bloc statique mais.... vous avez implicite GOTOs dans cet exemple (try/catch
est essentiellement un 'GOTO attraper si quelque chose se passe mal').Si une exception est levée vos
final
variables ne sont pas initialisées.De noter que l'utilisation de la statique des constructions va à l'encontre de l'Orienté Objet dogme. Il peut compliquer votre test et de faciliter le débogage plus difficile.
static initialization block
. Que puis-je faire lorsqu'un code dansstatic initialization block
jeter une exception que je ne veux pas de poignée.e.printStackTrace()
par lui-même dans un bloc catch me fait pleurer.Vous pouvez faire cela, mais vous devez quitter le bloc statique par la levée d'une exception - vous pouvez renvoyer l'exception qui a été pris ou un nouveau. En général, cette exception doit être un
RuntimeException
. Vous devriez vraiment ne pas attraper un génériqueException
mais plus exception spécifique(s) qui pourrait être levée à partir de l'intérieur de votretry
bloc. Enfin, si un initialiseur statique déclenche une exception alors il rendra la classe inutilisable au cours de cette manche particulière parce que la JVM ne tentera d'initialiser votre classe à la fois. Les tentatives ultérieures de l'utilisation de cette classe entraînera dans une autre exception, commeNoClassDefFoundError
.Donc, de travail, de votre initialiseur devrait lire quelque chose comme ceci:
En supposant que
InitializationFailedException
est une coutumeRuntimeException
, mais vous pouvez en utiliser un existant.En supposant qu'aucun où amont est dans une position pour attraper un ExceptionInInitializationError ou un général Exception ensuite, le programme ne devrait jamais essayer d'utiliser myVar. Si toutefois ceux-ci sont pris et le programme ne se termine pas, alors vous avez besoin de code pour surveiller et gérer myVar être null (ou être heureux avec
NullPointerExceptions
coming out partout).Je ne suis pas sûr qu'il y est une bonne façon de gérer cela.
Pouvez-vous mettre la déclaration dans le bloc finally?