2010-06-15 7 views
8

Molto breve domanda: C'è un modo più elegante per fare questo:Assegnare variabile finale in un blocco try

Object tmp; 
try { 
tmp = somethingThatCanFail(); 
} catch (Fail f) { 
tmp = null; 
} 
final Object myObject = tmp; 
// now I have a final myObject, which can be used in anonymous classes 
+0

check-out questo simile SO discussione: http://stackoverflow.com/questions/2773779/problems-initializing-a-final-variable-in- java – froadie

risposta

12

Si potrebbe estrarre la creazione del valore nel suo proprio metodo:

final Object myObject = getObjectOrNull(); 

public Object getObjectOrNull() { 
    try{ 
    return somethingThatCanFail(); 
    } catch (Fail f) { 
    return null; 
    } 
} 

E 'più a lungo, ma a seconda della definizione di "elegante" potrebbe essere più elegante.

+0

+1 ma in ogni caso la finale è solo una sicurezza ma puoi affrontarla senza? –

+0

'final' è uno strumento molto utile per documentare e far rispettare gli invarianti. Inoltre, a volte è necessario quando si interagisce con classi interne anonime. –

+0

Si suppone anche che aiuti il ​​compilatore con l'ottimizzazione, ma suppongo che ne possa fare abbastanza da solo. –

0

dipende da cosa si intende per "questo" (e "più elegante")

Non sono sicuro del motivo per cui pensi di aver bisogno di tmp AND myObject, ma non c'è modo di evitare di avere una di quelle dichiarazioni al di fuori del blocco try SE vuoi accedervi nel blocco catch.

Cosa c'è di sbagliato con

Object myObject = null; 
try { 
    myObject = somethingThatCanFail(); 
} catch (Fail f) { 
    // do nothing because we can deal with myObject being null just fine 
} 
+2

Penso che la domanda sia esplicitamente sull'assegnazione di una variabile 'final'. –

+0

Sì, la versione pre-modificata ha dimenticato di menzionare questo requisito davvero importante! – dty

0

In questi giorni ho tendono a farlo in questo modo

final Thingy zeFing; { 
    Thingy t = null; 
    try { 
     t = somethingThatCanFail(); 
    } catch (CurveBall f) { 
     // log... 
    } 
    zeFing = t; 
}