2010-06-15 26 views
8

muy corto pregunta: ¿Hay una manera más elegante de hacer esto:Asignar última variable en un bloque 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

la salida de este hilo SO similares: http://stackoverflow.com/questions/2773779/problems-initializing-a-final-variable-in- java – froadie

Respuesta

12

Se puede extraer la creación de valor en su propio método:

final Object myObject = getObjectOrNull(); 

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

Es más largo, pero dependiendo de su definición de "elegante" que podría ser más elegante.

+0

+1 pero de todos modos, la final es solo una garantía pero puede tratar sin ella, ¿no? –

+0

'final' es una herramienta muy útil para documentar e imponer invariantes. Además, a veces se requiere cuando se interactúa con clases internas anónimas. –

+0

Supuestamente también ayuda al compilador con la optimización, pero supongo que puede hacer suficiente por sí mismo. –

0

depende de lo que entendemos por "este" (y "más elegante")

No estoy seguro de por qué cree que necesita tmp AND myObject, pero no hay manera de evitar tener una de esas declaraciones fuera del bloque try SI desea acceder a él en el bloque catch.

¿Qué hay de malo en

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

Creo que la pregunta es explícitamente sobre la asignación de una variable 'final'. –

+0

Sí, la versión pre-editada olvidó mencionar ese requisito realmente importante. – dty

0

estos días tienden a hacerlo de esta manera

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