Pseudo-RAII em Java

Quando vejo um código nesse padrão:

InputStream is = getSomeInputStream();
try {
  // use 'is'
} catch(IOException ex) {
  // log ex
} finally {
  try {
    if (is != null) is.close();
  } catch(IOException ex) {}
}

Me dá náusea, vertigem, urticária! Comparem com este padrão:

try {
  final InputStream is = getSomeInputStream(); // se der exception vai lá pro catch
                                               // sem passar pelo finally
  try {
    // use 'is'                                // se der exception vai lá pro catch
                                               // passando pelo finally
  } finally {
    is.close();                                // certeza de que 'is' não é null
  }
} catch(IOException ex) {
  // log ex
}

Ele espelha a keyword ‘using’ do C#, só loga a exception uma vez e garante que ‘is’ é diferente de null no bloco ‘finally’ (e caso o close dispare uma exception, tem o catch logo abaixo).

Críticas?

Deixe um Comentário

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>