Czy istnieje jakiś dobry sposób użycia try-for-resources podczas otwierania w konstruktorze obiektu InputStream
, a następnie przekazywania go super konstruktorowi?Try-with-resources podczas wywoływania super konstruktora
Zasadniczo co chcę zrobić to:
public class A {
public A(InputStream stream) {
// Do something with the stream but don't close it since we didn't open it
}
}
public class B {
public B(File file) {
// We open the stream so we need to ensure it's properly closed
try (FileInputStream stream = new FileInputStream(file)) {
super(new FileInputStream(file));
}
}
}
Ale, oczywiście, ponieważ super
musi być pierwszą instrukcją w konstruktorze to jest niedozwolone. Czy jest jakiś dobry sposób na osiągnięcie tego?
Chciałbym, aby wywołujący podawał strumień wejściowy do 'public B (InputStream in)' i również to zamknął. Nie ma powodu, aby klasa pochodna była mniej uniwersalna niż klasa podstawowa. – EJP
Bardziej wszechstronny, ale także bardziej nieporęczny w użyciu. Mogłem obsługiwać oba, ale nie mając konstruktora 'B (plik plikowy)' nie jest opcja. – Raniz
Wydaje mi się, że twój problem pochodzi z pochłaniania strumienia wewnątrz konstruktora A. Gdyby tak nie było, po prostu zapisałbyś strumień w zmiennej instancji i wykonałbyś A 'AutoClosable'. –