Нет, это плохая практика. ИМО, вам даже стоит подумать о создании переменной final
.
Обработка ресурсов должна обрабатываться стандартным acquire(); try { use(); } finally { release(); }
способом. В этом случае:
final Reader rawIn = new FileReader("myfile.txt"); // Character encoding??
try {
BufferedReader in = new BufferedReader(rawIn);
// code
} finally {
rawIn.close();
}
На самом деле этот код выбирает любую кодировку символов, установленную по умолчанию. Я предлагаю быть явным с определенным жестко закодированным набором символов или параметром сверху.
final InputStream rawIn = new FileInputStream("myfile.txt");
try {
BufferedReader in = new BufferedReader(
new InputStreamReader(rawIn, "UTF-8")
);
// code
} finally {
rawIn.close();
}
Вы не должны создавать потоки / программы чтения обертки вне блока try (и до назначения ресурса), потому что они могут выдать. Точно так же их закрытие может выдать (на самом деле это была ошибка в BufferedOutputStream
, которая могла выдать flush
). Некоторые входные потоки могут иметь другие ресурсы, поэтому вам нужно два try { ... finally { x.close(); }
s.
Для вывода вы обычно должны flush
при нормальном ходе событий. Но, как правило, не в исключительных случаях. На самом деле close
обычно делает flush
, поэтому вам не следует закрывать их в исключительном случае. Если у декораторов есть и flush
, и у них есть ресурсы, вам придется улыбаться и обнажать их.
Есть очень редкие случаи, когда обнуление является хорошей идеей. Например, если переменная является единственной ссылкой на большой объект, и вы собираетесь создать новый большой объект, чтобы назначить ему, может быть лучше очистить ссылку, чтобы позволить старому быть восстановленным перед выделением нового.