Ho una variabile che non dovrebbe cambiare il suo valore dopo che è stata inizializzata, quindi voglio definirla come variabile finale.java: come dichiarare una variabile finale che è inizializzata all'interno di un blocco try-catch?
il problema è che la variabile deve essere inizializzato all'interno di un blocco try, quindi ottenere i seguenti problemi:
ho il seguente codice:
Connection conn = null;
try {
conn = getConn(prefix);
[...do some stuff with conn...]
} catch (Exception e) {
throw new DbHelperException("error opening connection", e);
} finally {
closeConnection(conn);
}
Se io dichiaro la variabale come finale , senza inizializzarlo su null, ottengo un 'La variabile locale conn potrebbe non essere stata inizializzata' sul blocco finally. D'altra parte, se lo dichiaro definitivo e lo inizializzo a null, ottengo l'errore "La variabile locale finale conn non può essere assegnata" nel blocco try.
EDIT: dopo la risposta LXX, sono venuto con questa versione
try {
final Connection conn = conn = getConn(prefix);
try {
return selectAll(conn, sql, params);
} catch (Exception e) {
throw new DbHelperException("error executing query", e);
} finally {
closeConnection(conn);
}
} catch (Exception e) {
throw new DbHelperException("error opening connection", e);
}
Quindi questo dovrebbe essere il modo per farlo?
-
Lezione imparata:
Penso che la risposta corretta alla domanda è quella che LXX ha dato, ma in questo caso penso che i contro di dichiarare le outweights finali variabili suoi benefici ...
-
EDIT: trovato due domande sul overflow dello stack su quando usare finale
When should one use final for method parameters and local variables?
Using "final" modifier whenever applicable in java
Che ne dici di accodamento 'finalConnection finalConn = conn;' al tuo codice? – biziclop
Perché hai bisogno sia di 'try's? Perché non avere un solo try-catch in cui ottieni la connessione e usala per selezionare tutto? – yshavit
Mi chiedo perché pensi che sia così importante dichiararlo definitivo. Sembra piuttosto nannyish e naggy per me. Se fossi un utente, e ho chiamato il tuo metodo per ottenere una connessione, non riesco a vedere alcun motivo per cui vorrei mandarlo in fumo cambiandolo. E se lo facessi, direi che le conseguenze dovrebbero essere sull'utente. – duffymo