Nie, to jest złą praktyką. IMO, powinieneś rozważyć zrobienie zmiennej final
.
Obsługa zasobów powinna być obsługiwana w standardowy sposób: acquire(); try { use(); } finally { release(); }
. W takim przypadku:
final Reader rawIn = new FileReader("myfile.txt"); // Character encoding??
try {
BufferedReader in = new BufferedReader(rawIn);
// code
} finally {
rawIn.close();
}
W rzeczywistości ten kod odbiera wszelkie kodowanie znaków ustawione domyślnie. Sugeruję bycie wyraźnym z konkretnym zakodowanym na stałe zestawem znaków lub Parameterise from Above.
final InputStream rawIn = new FileInputStream("myfile.txt");
try {
BufferedReader in = new BufferedReader(
new InputStreamReader(rawIn, "UTF-8")
);
// code
} finally {
rawIn.close();
}
Nie należy tworzyć owinięcia strumienie/czytelników spoza bloku try (a przed przypisaniem zasobów), ponieważ mogą one rzucać. Podobnie ich zamknięcie może rzucić (to był rzeczywiście błąd w BufferedOutputStream
, który może rzucić na flush
). Niektóre strumienie wejściowe mogą mieć inne zasoby, więc potrzebujesz dwóch s. try { ... finally { x.close(); }
.
W przypadku danych wyjściowych generalnie należy wykonać flush
w normalnym toku zdarzeń. Ale generalnie nie w wyjątkowych przypadkach. Rzeczywiście close
zwykle ma wartość flush
, dlatego nie należy ich zamykać w wyjątkowych przypadkach. Jeśli dekoratorzy, zarówno flush
i mają zasoby, będziesz musiał uśmiechać się i go nosić.
Istnieje wiele rzadkich okazji, kiedy zerowanie jest dobrym pomysłem. Na przykład, jeśli zmienna jest jedynym odniesieniem do dużego obiektu i zamierzasz utworzyć nowy duży obiekt do przypisania do niego, najlepiej jest wyczyścić odniesienie, aby umożliwić odzyskanie starego przed przydzieleniem nowego.
@Hei: Witamy w SO. Tylko na przyszłość (i jeśli edytujesz to pytanie), możesz wciskać linie kodu z czterema spacjami, które pojawią się w specjalnych blokach kodu, co ułatwia ich czytanie. – Pops
Dziękuję za komentarz, który zajrzę w to na przyszłe pytania. – Hei