Es stellt sich heraus, dass fast niemand Ressourcen in Java korrekt schließt. Programmierer verwenden entweder try-finally
block überhaupt nicht oder setzen einfach resource.close()
in finally
, was auch falsch ist (weil Throwable
von close()
kann Throwable
von try blockieren). Manchmal setzen sie etwas wie IOUtils.closeQuietly()
mit nur für InputStream
, aber nicht für OutputStream
. try-with-resources
löst alle diese Probleme, aber es gibt immer noch eine große Anzahl von Projekten in Java 6 geschrieben.
Was ist der beste Weg, try-with-resources
in Java 6 zu emulieren? Jetzt benutze ich Guava Closer , was besser ist als nichts, aber immer noch hässlicher als try-with-resources
. Es gibt auch ein Muster, das als Kreditmuster bezeichnet wird, aber das Fehlen von Lambdas in Java macht dieses Muster sehr schwerfällig. Gibt es einen besseren Weg?
Wenn Ihr einziges Problem mit IOUtils.closeQuietly
darin besteht, Ausnahmen in OutputStreams zu ignorieren, können Sie einfach close()
für sie aufrufen oder eine eigene Utility-Klasse erstellen, die die beiden automatisch unterschiedlich behandelt:
Die korrekte überladene Methode wird zur Kompilierzeit in allen gängigen Situationen ausgewählt. Wenn Sie jedoch OutputStream
s als Closeable
s übergeben, müssen Sie dies ändern, um eine dynamische instanceof
Prüfung durchzuführen um sicherzustellen, dass OutputStream
s immer Ausnahmen auslöst.
Tags und Links java try-with-resources